- Published on
python中的函数链
- Authors
- Name
- Lif
今天遇到这样一道题
Create a function add that adds numbers together when called in succession.
So add(1) should return 1, add(1)(2) should return 1+2, ...
add(1)(2)(3)(4).....
要构造python中的链式函数,目前只想到两种方法:
1.子类化int并定义call
第一种方法是使用定义 call 的自定义 int 子类,它返回一个具有更新值的自身新实例:
class CustomInt(int):
def __call__(self, v):
return CustomInt(self + v)
现在可以定义函数 add 以返回一个 CustomInt 实例,该实例作为返回自身更新值的可调用对象,可以连续调用
>>> def add(v): # add = CustomInt 也是可行的
... return CustomInt(v)
>>> add(1)
1
>>> add(1)(2)
3
>>> add(1)(2)(3)(44) # and so on..
50
2.定义一个闭包,需要额外调用yeild
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