【问题标题】:Python - value unpacking order in method parametersPython - 方法参数中的值解包顺序
【发布时间】:2020-03-16 14:32:34
【问题描述】:
def fun(a, b, c, d):
    print('a:', a, 'b:', b, 'c:', c, 'd:', d)

为什么这个有效

fun(3, 7, d=10, *(23,))

并打印出来:

a: 3 b: 7 c: 23 d: 10

此时

fun(3, 7, c=10, *(23,))

没有

Traceback (most recent call last):
  File "/home/lookash/PycharmProjects/PythonLearning/learning.py", line 10, in <module>
    fun(3, 7, c=10, *(23,))
TypeError: fun() got multiple values for argument 'c'

【问题讨论】:

  • 我不知道引发错误的确切原因,但你不应该在关键字参数之后有可变参数。通常会引发错误,但元组解包似乎会引发与正常 SyntaxError: positional argument follows keyword argument 不同的错误。
  • @Error-SyntacticalRemorse。我认为你没有抓住重点。 OP 发现了一种情况,您实际上可以在关键字之后放置一个位置,并且它可以工作。
  • @MadPhysicist 我明白了。但我更多地只是声明不应该在关键字参数之后进行元组解包。因此,我将其作为评论而不是答案。
  • 很棒的问题。从来不知道这是一件事。

标签: python unpack argument-unpacking


【解决方案1】:

使用*(23,),您将解包元组(23,) 中的值作为位置参数,遵循已定义的位置参数,即3 用于a7 用于b,所以23 将被分配给参数c,这就是fun(3, 7, d=10, *(23,)) 起作用的原因,但是在fun(3, 7, c=10, *(23,)) 中,您还将值10 分配给c 作为关键字参数,因此它被认为是冲突c 不能同时分配给 2310

请注意,虽然合法,但有些人不鼓励在关键字参数之后解压缩可迭代参数,如 here 所讨论的那样,尽管语法最终被裁定保留。

【讨论】:

  • 很清楚发生了什么,但是从什么时候开始可以解压缩关键字之后的位置?
  • 从 Python 3 开始。
  • 你有那个来源吗?它是故意和记录的,还是可以说是错误/遗漏?
  • 就操作顺序而言,元组解包必须在关键字参数之前进行。可能是一个遗漏...
  • @MadPhysicist 我的错。我在想别的东西。这种语法在 Python 2 中实际上也是合法的。从test_ast.pyf(1,2,c=3,*d,**e) 的CPython 测试用例可以看出,主要用例是允许包装函数以更直观的方式将变量参数和关键字参数传递给被包装函数,方法是放置两个变量参数和变量关键字参数在参数列表的末尾。
猜你喜欢
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
相关资源
最近更新 更多