如何在Python中使order-n函数可调用



您有以下代码:

def f(val):
return lambda x: x + val
assert f(5)(6) == 11

这行得通,但你怎么能把它做成n订单呢?

assert f(5)(6)(7)...(n) == sum of values

我怎样才能做到这一点?

如果你不介意有一个特殊的结束链的调用,这里是:

from functools import partial
def f(func, initializer=None):
sentinel = object()
def _f(val=sentinel, oldval=initializer):
if val is sentinel:
return oldval
return partial(_f, oldval=func(val, oldval))
return _f

用法:

>>> n_sum = f(lambda x,y: x+y, 0)  # binary function, initial value
>>> n_sum(5)(6)(7)()
18

如果您希望对整数进行特定的求和,从int继承将允许您扩展它。我认为这是一个很大的否定,但这里是为了完成:

class A(int):
def __call__(self, val):
return A(self+val)

>>> A()
0
>>> A(5)
5
>>> A(5)(6)
11

通常,您可以添加任意函数,也可以将其作为一个单独的函数来执行(无需继承(,但它需要一些特殊的停止值或函数调用来区分并询问最终结果。

要创建一个可以用所需行为调用n次的可调用函数,可以使用自定义可调用对象(一个带有调用方法的类(。以下是实现这一目标的方法:

class NCallableFunc:
def __init__(self, func, val):
self.x = val
self.f = val
def __call__(self, x):
self.f = self.f(x)
return NCallableFunc(self.f)
def NFunc(self):
return self.f
def test(x):
return NCallableFunc(lambda y: x + y)
# Testing
result = test(5)(6)(7)(8)(9)  # You can chain as many calls as you want
print(result.NFunc())

最新更新