<p>我不知道这是否是<em>函数</em>链接,正如它是<em>可调用的</em>链接一样,但是,由于函数<em>是</em>可调用的,我想没有造成任何伤害。不管怎样,我有两种方法可以考虑这样做:</p>
<h3>分类<code>int</code>并定义<code>__call__</code>:</h3>
<p>第一种方法是使用自定义的<code>int</code>子类定义<a href="https://docs.python.org/3/reference/datamodel.html#object.__call__" rel="noreferrer">^{<cd2>}</a>,该子类使用更新的值返回自身的新实例:</p>
<pre><code>class CustomInt(int):
def __call__(self, v):
return CustomInt(self + v)
</code></pre>
<p>函数<code>add</code>现在可以定义为返回一个<code>CustomInt</code>实例,该实例作为返回自身更新值的可调用实例,可以连续调用:</p>
<pre><code>>>> def add(v):
... return CustomInt(v)
>>> add(1)
1
>>> add(1)(2)
3
>>> add(1)(2)(3)(44) # and so on..
50
</code></pre>
<p>此外,作为一个<code>int</code>子类,返回值保留<code>__repr__</code>和<code>__str__</code>s的<code>int</code>行为。不过,对于更复杂的操作,应该适当定义其他dunders</em>。</p>
<p>正如@Caridorc在评论中指出的,<code>add</code>也可以简单地写成:</p>
<pre><code>add = CustomInt
</code></pre>
<p>将类重命名为<code>add</code>,而不是<code>CustomInt</code>也同样适用。</p>
<hr/>
<h3>定义一个闭包,需要额外的调用来产生值:</h3>
<p>我唯一能想到的另一种方法是使用嵌套函数,该函数需要额外的空参数调用才能返回结果。我不会使用<code>nonlocal</code>并选择将属性附加到函数对象,使其在Pythons之间可移植:</p>
<pre><code>def add(v):
def _inner_adder(val=None):
"""
if val is None we return _inner_adder.v
else we increment and return ourselves
"""
if val is None:
return _inner_adder.v
_inner_adder.v += val
return _inner_adder
_inner_adder.v = v # save value
return _inner_adder
</code></pre>
<p>这会连续返回自身(<code>_inner_adder</code>),如果提供了<code>val</code>,则会递增(<code>_inner_adder += val</code>),如果没有,则返回原样的值。就像我提到的,它需要额外的<code>()</code>调用才能返回递增的值:</p>
<pre><code>>>> add(1)(2)()
3
>>> add(1)(2)(3)() # and so on..
6
</code></pre>