Python-メソッドパラメータの値の展開順序


8
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なるほど。しかし、私はタプルのアンパックはキーワード引数の後に行われるべきではないというステートメントを作成していました。したがって、私は答えではなくコメントとしてそれを作りました。
エラー-構文的反省

1
素晴らしい質問です。これが何かであることを知らなかった。
エラー-構文的

回答:


6

*(23,)あなたはタプル内の値を開梱され(23,)、位置引数としてすでにすなわち、規定されている位置引数以下3のためにa7のためにb、その23パラメータに割り当てられるc理由である、fun(3, 7, d=10, *(23,))動作しますが、中にfun(3, 7, c=10, *(23,))あなたも値に割り当てる10cなどキーワード引数は、それはのように、競合と考えられているcの両方に割り当てることはできません2310

構文は最終的に残ると規定されていますが、合法ではありますが、ここで説明するように、キーワード引数の後に反復可能な引数をアンパックすることはお勧めしません。


何が起こっているのかは明らかですが、キーワードの後に​​定位置を展開できるのはいつからですか?
マッド

Python 3以降
2019年

そのための情報源はありますか?それは意図的で文書化されていますか、それとも間違いなくバグ/省略ですか?
マッド

タプルのアンパックは、操作の順序に関して、キーワード引数の前に行う必要があります。省略かもしれません...
エラー-構文的反省

1
@MadPhysicist悪い。他のことを考えていました。この構文は、Python 2でも実際に有効です。主な使用ケースは、のCPythonのテストケースから明らかなようf(1,2,c=3,*d,**e)test_ast.py、ラッパー関数は、可変引数と変数キーワードの両方を配置することによって、より直感的な方法で包ま関数に可変引数とキーワード引数を渡すことができるようにすることです引数リストの最後の引数。
blhsing
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.