我不知道这是否是函数链,就像它的可调用链一样,但是,因为函数是可调用的,我想这没有什么坏处。 无论哪种方式,有两种方法我可以想到这样做:
子类_inner_adder并定义val:
第一种方法是使用自定义_inner_adder子类定义_inner_adder,该子类返回具有更新值的新实例:
class CustomInt(int):
def __call__(self, v):
return CustomInt(self + v)
现在可以定义函数_inner_adder以返回val实例,该实例可以连续调用,作为返回其自身更新值的可调用对象:
>>> def add(v):
... return CustomInt(v)
>>> add(1)
1
>>> add(1)(2)
3
>>> add(1)(2)(3)(44) # and so on..
50
此外,作为_inner_adder子类,返回值保留val和_inner_adder += val行为()s。 但是,对于更复杂的操作,您应该适当地定义其他dunders。
正如@Caridorc在评论中指出的那样,_inner_adder也可以简单地写成:
add = CustomInt
将类重命名为_inner_adder而不是val也可以类似地工作。
定义一个闭包,需要额外的调用才能产生价值:
我能想到的另一种方法涉及一个嵌套函数,它需要一个额外的空参数调用才能返回结果。 我没有使用_inner_adder并选择将属性附加到函数对象以使其在Pythons之间可移植:
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
这将自动返回(_inner_adder),如果提供了val,则递增它(_inner_adder += val),如果不是,则返回该值。 就像我提到的,它需要额外的()调用才能返回增加的值:
>>> add(1)(2)()
3
>>> add(1)(2)(3)() # and so on..
6