Published on

python中的函数链

Authors
  • avatar
    Name
    Lif
    Twitter

今天遇到这样一道题

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