1. ホーム
  2. python

[解決済み] 引数のアンパッキング:名前付き引数のみが*式の後に続くことができます。

2022-02-11 02:50:16

質問

以下はPythonで見事に動作します。

def f(x,y,z): return [x,y,z]

a=[1,2]

f(3,*a)

の要素は a のように呼び出した場合と同じように解凍されます。 f(3,1,2) を返します。 [3,1,2] . すばらしい

の要素を展開することができません。 a 最初 の2つの引数を指定します。

f(*a,3)

のように呼び出すのではなく f(1,2,3) SyntaxError: only named arguments may follow *expression" と表示されます。

なぜそのようにしなければならないのか、また、一時変数に頼ることなく、引数リストの任意の部分に配列を展開するための、私の知らない巧妙なトリックがあるのではないかと思っているのです。

解決方法は?

Raymond Hettingerの回答が指摘しているように、この を変更することができます。 はPython 3で変更され 関連する提案はこちら ということです。 特に今回の質問に関連して、その提案に対する変更の可能性の一つとして議論されたのがこちらです。

<ブロッククオート

Exprlistの最後の項目として、星印のついた式だけを許可する。そうすれば アンパッキングコードを少し修正し、スター付き式にイテレータを割り当てることができるようにしました。この の動作は、意外性がありすぎるという理由で却下されました。

というわけで、関数の引数のアンパッキングの制限には実装上の理由があるのですが、確かにちょっと意外ですね。

とりあえず、私が探していた回避策を紹介します。今思えば当たり前ですが。

f(*(a+[3]))