首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python函数工具部分混淆

python函数工具部分混淆
EN

Stack Overflow用户
提问于 2021-11-14 04:30:53
回答 2查看 75关注 0票数 3

请考虑以下几点:

代码语言:javascript
运行
复制
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

工作正常。但是:

代码语言:javascript
运行
复制
def foo(x, y, z):
   return x+y+z

bar = partial(foo, y=3)

bar(1, 2)

barfs:

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for argument 'y'

显然,我遗漏了一些明显的东西,但是什么呢?

EN

回答 2

Stack Overflow用户

发布于 2021-11-14 04:37:08

官方functools documentationpartial()的定义是:

代码语言:javascript
运行
复制
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()函数:

代码语言:javascript
运行
复制
>>> from inspect import signature
>>> signature(bar)
<Signature (x, *, y=3, z)>

要解决您的错误,可以向bar()函数提供关键字参数:

代码语言:javascript
运行
复制
def foo(x, y, z):
   return x+y+z

bar = partial(foo, y=3)

bar(x=1, z=2)
票数 5
EN

Stack Overflow用户

发布于 2021-11-14 05:12:14

来自the python 3.9 documentation

返回一个新的分部对象,当被调用时,它的行为类似于使用位置参数、args和关键字参数关键字调用的函数。如果向调用提供了更多参数,则会将这些参数附加到args。如果提供了其他关键字参数,它们将扩展和覆盖关键字。

代码语言:javascript
运行
复制
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.

  • Slots的实参的值,这些实参的值被标记为“
  • ”。尚未赋值的槽被认为是未填充的所有槽都被标记为empty.
  • Positional参数首先被赋值,然后是关键字arguments.
  • For每个位置参数:
    • 尝试将参数绑定到第一个未填充的参数槽。如果槽不是vararg槽,则将该槽标记为“error.
    • Otherwise,”。如果下一个未填充的槽是vararg槽,并且它没有名称,则它是slot.

。如果下一个未填充的槽是vararg槽,则所有剩余的非

参数都放入vararg

对于每个关键字参数:

    • 如果存在与关键字同名的参数,则将该参数的值分配给该参数槽。但是,如果参数槽已被填充,则它是一个字典。如果存在'keyword error.
    • Otherwise,‘参数,则该参数将使用关键字名称作为字典键添加到字典中,除非已经存在具有该键的条目,在这种情况下,如果没有关键字字典,则它是error.
    • Otherwise,,并且没有匹配的命名参数,则它是error.

  • 最后:
    • 如果vararg槽还没有填满,则分配一个空的元组作为它的值。
    • 对于每个剩余的空槽:如果该槽有默认值,则用默认值填充该槽。如果没有缺省值,则为error.

不过,我不太确定上面的是不是最新的,或者在这种情况下如何应用它,因为我不确定bar是否有位置参数或变量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69960294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档