python functools 部分混淆

标签 python functools

考虑以下几点:

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/

相关文章:

python - 在 Python 中检索数据属性的最佳方法?

python - 使用opencv(python)时出现 "orb.detectAndCompute"错误

python - 如何测试 functools.partial 生成预期的函数对象

python - 如何将 functools.partial 与 os.path.join 一起使用?

python - tqdm 和 numpy 向量化

python - 如何从keras指标中获取TPR和TNR

python - 如何等待python中动态启动的多个线程完成

python - Python 中的仿函数与函数闭包

python - 将 f(x) 转换为 f(*x) 的标准 Python 包装器?