【问题标题】:Python argument matching for f(a, *b)f(a, *b) 的 Python 参数匹配
【发布时间】:2018-09-03 05:25:27
【问题描述】:
def f(a,*b):
    print(a,b)

对于上面定义的函数 f,如果我调用 f(1, *(2,3)),它会按预期打印 1, (2,3)。

但是调用f(a=1, *(2,3)) 会导致错误: TypeError: f() 为参数 'a' 获得了多个值

任何位置参数也可以作为显式关键字参数提供。 f(a=1, *(2,3)) 应该只有一种解释,没有歧义。

【问题讨论】:

  • The docs 解释一下:“首先,为形参创建一个未填充槽的列表。如果有 N 个位置参数,则将它们放在前 N 个槽中。接下来,对于每个关键字参数,标识符用于确定对应的槽(如果标识符与第一个形参名称相同,则使用第一个槽,依此类推)。如果槽已被填满,则引发 TypeError 异常。
  • @Amadan,感谢您的链接。实际上我正在阅读“Learning Python 5ed”,我认为(发现)书中提到的内容与 python 文档相矛盾。

标签: python argument-matching


【解决方案1】:
def f(a,*b):
    print(a,b)
f(1,*(2,3))
f(1,2,3)

考虑上面的例子,两者都会以同样的方式调用同一个函数 现在如果你指定一个 =1

f(a=1,2,3)
#or in other syntax
f(2,3,a=1)

那么它是否考虑a=1 or a=2 有歧义,因为 2 是第一个位置参数,a=1 是显式关键字参数。

【讨论】:

  • 感谢阿尔宾的解释。 python 文档中的以下句子是理解该行为的关键:“如果语法 *expression 出现在函数调用中,则表达式必须计算为可迭代对象。来自这些可迭代对象的元素被视为附加位置参数。”正如你所解释的。 “Learning Python 5e” (p531) 中解释的内容似乎不准确,因为它说“通过匹配名称分配关键字参数”步骤之后是“将额外的非关键字参数分配给 *name 元组”,即 a=1 和 *(2 ,3) 分别在我的问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2023-03-27
  • 2021-06-15
  • 2012-06-26
  • 2020-12-25
相关资源
最近更新 更多