我尝试重新实现像partial
这样的东西(以后会有更多的行为)。现在,在以下示例中,lazycall1
似乎与lazycall2
一样正常,因此我不明白为什么documentation of partial
建议使用较长的第二个版本。有什么建议?可以让我遇到麻烦吗?
def lazycall1(func, *args, **kwargs):
def f():
func(*args, **kwargs)
return f
def lazycall2(func, *args, **kwargs):
def f():
func(*args, **kwargs)
f.func=func # why do I need that?
f.args=args
f.kwargs=kwargs
return f
def A(x):
print("A", x)
def B(x):
print("B", x)
a1=lazycall1(A, 1)
b1=lazycall1(B, 2)
a1()
b1()
a2=lazycall2(A, 3)
b2=lazycall2(B, 4)
a2()
b2()
编辑:实际上到目前为止给出的答案并不完全正确。即使有双重论据也行。还有其他原因吗?
def lazycall(func, *args):
def f(*args2):
return func(*(args+args2))
return f
def sum_up(a, b):
return a+b
plusone=lazycall(sum_up, 1)
plustwo=lazycall(sum_up, 2)
print(plusone(6)) #7
print(plustwo(9)) #11
答案 0 :(得分:2)
第二种形式唯一的额外功能是一些额外的属性。如果您开始传递lazycall2返回的函数,这可能会有所帮助,以便接收函数可以根据这些值做出决定。
答案 1 :(得分:0)
functools.partial可以在内部返回函数中接受其他参数 - 或重写参数。您的内部f()
函数没有,因此您无需在lazycall2
中执行任何操作。但是,如果你想做这样的事情:
def sum(a, b):
return a+b
plusone = lazycall3(sum, 1)
plusone(6) # 7
您需要执行这些文档中显示的内容。
答案 2 :(得分:0)
仔细查看链接到的Python文档页面中内部函数newfunc
中的参数名称,它们与传递给内部函数的args
与fargs
不同。 ,keywords
与fkeywords
。它们对partial
的实现保存了赋予外部函数的参数,并将它们添加到赋予内部函数的参数中。
由于在内部函数中重用了完全相同的参数名,因此外部函数的原始参数将无法访问。
至于在外部函数上设置func
,args
和kwargs
属性,函数是Python中的对象,您可以在其上设置属性。这些属性允许您在将它们传递到lazycall
函数后访问原始函数和参数。因此a1.func
将A
而a1.args
将为[1]
。
如果您不需要跟踪原始函数和参数,那么您应该没问题
与您的lazycall1
。