请考虑以下几点:
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)
barfs:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for argument 'y'
显然,我遗漏了一些明显的东西,但是什么呢?
发布于 2021-11-14 04:37:08
官方functools documentation对partial()
的定义是:
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)
发布于 2021-11-14 05:12:14
来自the python 3.9 documentation
返回一个新的分部对象,当被调用时,它的行为类似于使用位置参数、args和关键字参数关键字调用的函数。如果向调用提供了更多参数,则会将这些参数附加到args。如果提供了其他关键字参数,它们将扩展和覆盖关键字。
def foo(x, y, z):
return x+y+z
bar = partial(foo, y=3)
print(bar.args) # ()
print(bar.keywords) # {'y': 3}
调用bar(1, 2)
时,bar.args
将变为(1, 2)
,而bar.keywords
仍为{'y': 3}
注意这一点,下一件事是引用"Function Calling Behavior" as specified in PEP 3102
调用函数时,将输入参数分配给形参,如下所示:
对于每个形式参数,都有一个空位,用于包含分配给该parameter.
。如果下一个未填充的槽是vararg槽,则所有剩余的非
参数都放入vararg
对于每个关键字参数:
。
不过,我不太确定上面的是不是最新的,或者在这种情况下如何应用它,因为我不确定bar
是否有位置参数或变量。
https://stackoverflow.com/questions/69960294
复制相似问题