<div dir="ltr">By the way, these are not "partial functions", and shouldn't be called that.  These are "partial function applications".<div><br>On Saturday, August 4, 2018 at 12:03:50 PM UTC-4, Fabrizio Messina wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 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"><code><div><span style="color:#000"><br></span><span style="color:#008">from</span><span style="color:#000"> functools </span><span style="color:#008">import</span><span style="color:#000"> </span><span style="color:#008">partial</span><span style="color:#000"><br><br><br></span><span style="color:#008">def</span><span style="color:#000"> add</span><span style="color:#660">(</span><span style="color:#000">x</span><span style="color:#660">:</span><span style="color:#000"> </span><span style="color:#008">int</span><span style="color:#660">,</span><span style="color:#000"> y</span><span style="color:#660">:</span><span style="color:#000"> </span><span style="color:#008">int</span><span style="color:#660">)</span><span style="color:#000"> </span><span style="color:#660">-></span><span style="color:#000"> </span><span style="color:#008">int</span><span style="color:#660">:</span><span style="color:#000"><br>    </span><span style="color:#008">return</span><span style="color:#000"> x </span><span style="color:#660">+</span><span style="color:#000"> y<br><br><br>add_2 </span><span style="color:#660">=</span><span style="color:#000"> </span><span style="color:#008">partial</span><span style="color:#660">(</span><span style="color:#000">add</span><span style="color:#660">,</span><span style="color:#000"> </span><span style="color:#066">2</span><span style="color:#660">)</span><span style="color:#000"><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"><code><div><span style="color:#000"><br></span><span style="color:#008">def</span><span style="color:#000"> add</span><span style="color:#660">(</span><span style="color:#000">x</span><span style="color:#660">:</span><span style="color:#000"> </span><span style="color:#008">int</span><span style="color:#660">,</span><span style="color:#000"> y</span><span style="color:#660">:</span><span style="color:#000"> </span><span style="color:#008">int</span><span style="color:#660">)</span><span style="color:#000"> </span><span style="color:#660">-></span><span style="color:#000"> </span><span style="color:#008">int</span><span style="color:#660">:</span><span style="color:#000"><br>    </span><span style="color:#008">return</span><span style="color:#000"> x </span><span style="color:#660">+</span><span style="color:#000"> y<br><br>add_2 </span><span style="color:#660">=</span><span style="color:#000"> add</span><span style="color:#660">{</span><span style="color:#066">2</span><span style="color:#660">}</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"><code><div><span style="color:#000">sort_by_x </span><span style="color:#660">=</span><span style="color:#000"> sort</span><span style="color:#660">{</span><span style="color:#000">key</span><span style="color:#660">=</span><span style="color:#008">lambda</span><span style="color:#000"> element</span><span style="color:#660">:</span><span style="color:#000"> element</span><span style="color:#660">.</span><span style="color:#000">x</span><span style="color:#660">}</span><span style="color:#000"><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"><code><div><span style="color:#000"><br></span><span style="color:#800"># prepare the function</span><span style="color:#000"><br>get_sorted_users</span><span style="color:#660">:</span><span style="color:#000"> </span><span style="color:#606">Callable</span><span style="color:#660">[[],</span><span style="color:#000"> </span><span style="color:#606">Iterator</span><span style="color:#660">[</span><span style="color:#606">User</span><span style="color:#660">]]</span><span style="color:#000"> </span><span style="color:#660">=</span><span style="color:#000"> sort</span><span style="color:#660">{</span><span style="color:#000">users</span><span style="color:#660">,</span><span style="color:#000"> key</span><span style="color:#660">=</span><span style="color:#008">lambda</span><span style="color:#000"> user</span><span style="color:#660">:</span><span style="color:#000"> user</span><span style="color:#660">.</span><span style="color:#000">creation_date</span><span style="color:#660">}</span><span style="color:#000"><br><br></span><span style="color:#800"># continue with job at hand</span><span style="color:#000"><br></span><span style="color:#660">...</span><span style="color:#000"><br><br></span><span style="color:#800"># some where else, maybe another process</span><span style="color:#000"><br>sorted_users </span><span style="color:#660">=</span><span style="color:#000"> list</span><span style="color:#660">(</span><span style="color:#000">get_sorted_users</span><span style="color:#660">())</span><span style="color:#000"><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"><code><div><span style="color:#066">@dataclass</span><span style="color:#000"><br></span><span style="color:#008">class</span><span style="color:#000"> </span><span style="color:#606">Product</span><span style="color:#660">:</span><span style="color:#000"><br>    name</span><span style="color:#660">:</span><span style="color:#000"> str<br>    category</span><span style="color:#660">:</span><span style="color:#000"> </span><span style="color:#606">Category</span><span style="color:#000"><br>    price</span><span style="color:#660">:</span><span style="color:#000"> </span><span style="color:#606">Decimal</span><span style="color:#000"><br><br><br>smartphone_factory </span><span style="color:#660">=</span><span style="color:#000"> </span><span style="color:#606">Product</span><span style="color:#660">{</span><span style="color:#000">category</span><span style="color:#660">=</span><span style="color:#000">smartphone_<wbr>category</span><span style="color:#660">}</span><span style="color:#000"><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></blockquote></div></div>