<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; overflow-wrap: break-word;" class="prettyprint"><code class="prettyprint"><div class="subprettyprint"><span style="color: #000;" class="styled-by-prettify"><br></span><span style="color: #008;" class="styled-by-prettify">from</span><span style="color: #000;" class="styled-by-prettify"> functools </span><span style="color: #008;" class="styled-by-prettify">import</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">partial</span><span style="color: #000;" class="styled-by-prettify"><br><br><br></span><span style="color: #008;" class="styled-by-prettify">def</span><span style="color: #000;" class="styled-by-prettify"> add</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">x</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">int</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> y</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">int</span><span style="color: #660;" class="styled-by-prettify">)</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">-></span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">int</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"><br>    </span><span style="color: #008;" class="styled-by-prettify">return</span><span style="color: #000;" class="styled-by-prettify"> x </span><span style="color: #660;" class="styled-by-prettify">+</span><span style="color: #000;" class="styled-by-prettify"> y<br><br><br>add_2 </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">partial</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">add</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #066;" class="styled-by-prettify">2</span><span style="color: #660;" class="styled-by-prettify">)</span><span style="color: #000;" class="styled-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; overflow-wrap: break-word;" class="prettyprint"><code class="prettyprint"><div class="subprettyprint"><span style="color: #000;" class="styled-by-prettify"><br></span><span style="color: #008;" class="styled-by-prettify">def</span><span style="color: #000;" class="styled-by-prettify"> add</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">x</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">int</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> y</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">int</span><span style="color: #660;" class="styled-by-prettify">)</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">-></span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #008;" class="styled-by-prettify">int</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"><br>    </span><span style="color: #008;" class="styled-by-prettify">return</span><span style="color: #000;" class="styled-by-prettify"> x </span><span style="color: #660;" class="styled-by-prettify">+</span><span style="color: #000;" class="styled-by-prettify"> y<br><br>add_2 </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> add</span><span style="color: #660;" class="styled-by-prettify">{</span><span style="color: #066;" class="styled-by-prettify">2</span><span style="color: #660;" class="styled-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; overflow-wrap: break-word;" class="prettyprint"><code class="prettyprint"><div class="subprettyprint"><span style="color: #000;" class="styled-by-prettify">sort_by_x </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> sort</span><span style="color: #660;" class="styled-by-prettify">{</span><span style="color: #000;" class="styled-by-prettify">key</span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #008;" class="styled-by-prettify">lambda</span><span style="color: #000;" class="styled-by-prettify"> element</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> element</span><span style="color: #660;" class="styled-by-prettify">.</span><span style="color: #000;" class="styled-by-prettify">x</span><span style="color: #660;" class="styled-by-prettify">}</span><span style="color: #000;" class="styled-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; overflow-wrap: break-word;" class="prettyprint"><code class="prettyprint"><div class="subprettyprint"><span style="color: #000;" class="styled-by-prettify"><br></span><span style="color: #800;" class="styled-by-prettify"># prepare the function</span><span style="color: #000;" class="styled-by-prettify"><br>get_sorted_users</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Callable</span><span style="color: #660;" class="styled-by-prettify">[[],</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Iterator</span><span style="color: #660;" class="styled-by-prettify">[</span><span style="color: #606;" class="styled-by-prettify">User</span><span style="color: #660;" class="styled-by-prettify">]]</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> sort</span><span style="color: #660;" class="styled-by-prettify">{</span><span style="color: #000;" class="styled-by-prettify">users</span><span style="color: #660;" class="styled-by-prettify">,</span><span style="color: #000;" class="styled-by-prettify"> key</span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #008;" class="styled-by-prettify">lambda</span><span style="color: #000;" class="styled-by-prettify"> user</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> user</span><span style="color: #660;" class="styled-by-prettify">.</span><span style="color: #000;" class="styled-by-prettify">creation_date</span><span style="color: #660;" class="styled-by-prettify">}</span><span style="color: #000;" class="styled-by-prettify"><br><br></span><span style="color: #800;" class="styled-by-prettify"># continue with job at hand</span><span style="color: #000;" class="styled-by-prettify"><br></span><span style="color: #660;" class="styled-by-prettify">...</span><span style="color: #000;" class="styled-by-prettify"><br><br></span><span style="color: #800;" class="styled-by-prettify"># some where else, maybe another process</span><span style="color: #000;" class="styled-by-prettify"><br>sorted_users </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> list</span><span style="color: #660;" class="styled-by-prettify">(</span><span style="color: #000;" class="styled-by-prettify">get_sorted_users</span><span style="color: #660;" class="styled-by-prettify">())</span><span style="color: #000;" class="styled-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; overflow-wrap: break-word;" class="prettyprint"><code class="prettyprint"><div class="subprettyprint"><span style="color: #066;" class="styled-by-prettify">@dataclass</span><span style="color: #000;" class="styled-by-prettify"><br></span><span style="color: #008;" class="styled-by-prettify">class</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Product</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"><br>    name</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> str<br>    category</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Category</span><span style="color: #000;" class="styled-by-prettify"><br>    price</span><span style="color: #660;" class="styled-by-prettify">:</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Decimal</span><span style="color: #000;" class="styled-by-prettify"><br><br><br>smartphone_factory </span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify"> </span><span style="color: #606;" class="styled-by-prettify">Product</span><span style="color: #660;" class="styled-by-prettify">{</span><span style="color: #000;" class="styled-by-prettify">category</span><span style="color: #660;" class="styled-by-prettify">=</span><span style="color: #000;" class="styled-by-prettify">smartphone_category</span><span style="color: #660;" class="styled-by-prettify">}</span><span style="color: #000;" class="styled-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>