我尝试重新实现类似于“partial”的东西(稍后将具有更多行为)。现在在以下示例中,“lazycall1”似乎与“lazycall2”一样正常工作,因此我不明白为什么“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
functools.partial
返回的对象具有.func
、.keywords
和.func
属性。文档展示了一种在纯 Python 中模拟它的方法。但是,不会影响返回对象的调用 - 它只会使最初传递的函数和参数在返回的对象上可访问。 - AdamKG