0

私はこの機能を知らずに何年も python2 を使用してきましたが、タプルのアンパックは関数定義でサポートされているようです:

>>> def foo(a, (b, c)):
...     print a, b, c
...     
>>> t = (2, 3)
>>> foo(1, t)
1 2 3

デフォルトも許可されていますが、関数定義時ではなく関数呼び出し時にアンパックされているようです。そして、パックされた引数の1つ/任意/すべてを名前で渡す方法がわかりませんでした。おそらく不可能です。

>>> def foo(a, ((b, c), d)=('xy', 8)):
        print a, b, c, d
...     
>>> foo(0)
0 x y 8

これは明らかに奇妙な実装の詳細だけではありません:文法、特に an を注意深く読むfpdefと、関数定義がタプルのアンパック用に明示的に設計されていることがわかります。

私の質問は、なぜこれが設計上の選択だったのか、それが必要なユースケースの例は何ですか? 私には、python 1、2、3、5、7、9、13、17 の禅に違反する、あいまいでエラーが発生しやすい機能のようです....

4

1 に答える 1

3

この機能は、通常の変数割り当てで実行できるアンパックの自然な一般化として組み込まれました。この機能は完全に不要です。これはPython 3 で削除されました。あまり追加されず、イントロスペクションが乱雑になったためです。

このようなパラメーターは、名前で渡すことはできません。タプル パラメータには のような内部名が付けられ.0、関数のバイトコードはタプル パラメータをアンパックすることから始まります。技術的には次のようなことは可能ですが、

>>> def f((a, b)):
...     print a, b
...
>>> f(**{'.0': (0, 1)})
0 1

、それは本当に役に立ちません。

于 2016-03-30T23:54:17.810 に答える