考虑以下几点:
from functools import partial
def add(a, b, c):
return 100 * a + 10 * b + c
add_part = partial(add, c = 2, b = 1)
add_part(3)
312
工作正常。然而:
def foo(x, y, z):
return x+y+z
bar = partial(foo, y=3)
bar(1, 2)
吐槽:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for argument 'y'
显然我遗漏了一些明显的东西,但是什么?
最佳答案
partial()
的定义来自官方functools documentation是:
def partial(func, /, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = {**keywords, **fkeywords}
return func(*args, *fargs, **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
这意味着在您的情况下 partial()
返回 foo()
函数,其签名修改如下:
>>> from inspect import signature
>>> signature(bar)
<Signature (x, *, y=3, z)>
要解决您的错误,您可以为 bar()
函数提供关键字参数:
def foo(x, y, z):
return x+y+z
bar = partial(foo, y=3)
bar(x=1, z=2)
关于python functools 部分混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69960294/