<div dir="ltr">That's an awesome library! Congratulation for doing this and thanks for sharing!<br></div><br><div class="gmail_quote"><div dir="ltr">Em sáb, 4 de ago de 2018 às 13:42, Robert Vanden Eynde <<a href="mailto:robertve92@gmail.com">robertve92@gmail.com</a>> escreveu:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div>The funcoperators lib on pypi does exactly that:</div><div dir="auto"><br></div><div dir="auto">from funcoperators import partially</div><div dir="auto"><br></div><div dir="auto">@partially</div><div dir="auto">def add(x: int, y: int) -> int:<br> return x + y<br><br>add_2 = add[2]<br></div><div dir="auto"><br></div><div dir="auto">@partiallymulti</div><div dir="auto">def stuff(x,y,z):</div><div dir="auto"> return x - y + 2*z</div><div dir="auto"><br></div><div dir="auto">sort = partially(sorted)</div><div dir="auto">sort_by_x = sort.key(key=lambda element: element.x)<br></div><div dir="auto"><br></div><div dir="auto">The ".key" means "give a keyword argument".</div><div dir="auto">The ".val" or [] gives a positional argument.</div><div dir="auto">The ".part" accept positional and keyword arguments.</div><div dir="auto"><br><div class="gmail_quote" dir="auto"><div dir="ltr">Le sam. 4 août 2018 à 18:03, Fabrizio Messina <<a href="mailto:zauddelig@gmail.com" target="_blank">zauddelig@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"> <div>Hello, I would like to propose a new method to create a partial function.</div><div><br></div><div>At the moment we have to load the <b>partial</b> function from the <b>functool</b> library, and apply it to an existing function, e.g. <br></div><div style="background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px" class="m_7220575316215718552m_4098789531034423285prettyprint"><code class="m_7220575316215718552m_4098789531034423285prettyprint"><div class="m_7220575316215718552m_4098789531034423285subprettyprint"><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br></span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">from</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> functools </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">import</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">partial</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br><br><br></span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">def</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> add</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">(</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">x</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">int</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">,</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> y</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">int</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">)</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">-></span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">int</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br> </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">return</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> x </span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">+</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> y<br><br><br>add_2 </span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">=</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">partial</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">(</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">add</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">,</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#066" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">2</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">)</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br><br></span></div></code></div><div><br><br></div><div>While
partial expose the mechanism excellently its instantiation method is,
at times, not very friendly, I would like to propose a syntactic
sugar to create partial functions, in the case you create a partial function using <b>curly braces</b>:<br></div><div><br></div><div style="background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px" class="m_7220575316215718552m_4098789531034423285prettyprint"><code class="m_7220575316215718552m_4098789531034423285prettyprint"><div class="m_7220575316215718552m_4098789531034423285subprettyprint"><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br></span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">def</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> add</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">(</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">x</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">int</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">,</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> y</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">int</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">)</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">-></span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">int</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br> </span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">return</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> x </span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">+</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> y<br><br>add_2 </span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">=</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> add</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">{</span><span style="color:#066" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">2</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">}</span></div></code></div><div><br></div><br><div>At the moment this causes SyntaxError so the change is retro-compatible.</div><div><br></div><div>In the case of key word arguments we could have:</div><div><br></div><div><div style="background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px" class="m_7220575316215718552m_4098789531034423285prettyprint"><code class="m_7220575316215718552m_4098789531034423285prettyprint"><div class="m_7220575316215718552m_4098789531034423285subprettyprint"><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">sort_by_x </span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">=</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> sort</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">{</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">key</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">=</span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">lambda</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> element</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> element</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">.</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">x</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">}</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br></span></div></code></div><br></div><div><br></div><div>That
could be good as it would be an easy way to pre-load functions without
having to eagerly compute it, but without needing to pass the entire
function parameters to to other scopes.</div><div><br></div><div style="background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px" class="m_7220575316215718552m_4098789531034423285prettyprint"><code class="m_7220575316215718552m_4098789531034423285prettyprint"><div class="m_7220575316215718552m_4098789531034423285subprettyprint"><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br></span><span style="color:#800" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"># prepare the function</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br>get_sorted_users</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#606" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">Callable</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">[[],</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#606" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">Iterator</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">[</span><span style="color:#606" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">User</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">]]</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">=</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> sort</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">{</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">users</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">,</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> key</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">=</span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">lambda</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> user</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> user</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">.</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">creation_date</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">}</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br><br></span><span style="color:#800" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"># continue with job at hand</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br></span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">...</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br><br></span><span style="color:#800" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"># some where else, maybe another process</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br>sorted_users </span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">=</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> list</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">(</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">get_sorted_users</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">())</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br><br></span></div></code></div><br><br><div>Even create a factory method on the fly:</div><div style="background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px" class="m_7220575316215718552m_4098789531034423285prettyprint"><code class="m_7220575316215718552m_4098789531034423285prettyprint"><div class="m_7220575316215718552m_4098789531034423285subprettyprint"><span style="color:#066" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">@dataclass</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br></span><span style="color:#008" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">class</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#606" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">Product</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br> name</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> str<br> category</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#606" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">Category</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br> price</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">:</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#606" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">Decimal</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br><br><br>smartphone_factory </span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">=</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"> </span><span style="color:#606" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">Product</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">{</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">category</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">=</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">smartphone_category</span><span style="color:#660" class="m_7220575316215718552m_4098789531034423285styled-by-prettify">}</span><span style="color:#000" class="m_7220575316215718552m_4098789531034423285styled-by-prettify"><br><br></span></div></code></div><div><br><br></div><div>Now
all this can already be done with partial, but adding this syntactic
sugar would reduce the perception of `partial` as an advanced feature,
alleviating the use of closures created only for the sake of avoiding an
explicit partial.</div><div><br></div><div>In my opinion this syntactic sugar has a lot of potential adoption seen the general interest in functional programming.<br></div></div>_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" rel="noreferrer" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</blockquote></div></div></div>
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">“If you're going to try, go all the way. Otherwise, don't even start. ..." <br> Charles Bukowski</div>