2016-03-30 7 views
1
argspec

に開梱私もこの機能について知らなくても、年間のpython2を使用しましたが、どうやら関数DEFSでサポートされてアンパックタプル:タプルは

>>> def foo(a, (b, c)): 
...  print a, b, c 
...  
>>> t = (2, 3) 
>>> foo(1, t) 
1 2 3 
彼らはで展開しているように見えるけれども

も、デフォルトは、許可されています関数の呼び出し時間であり、関数のdef時間ではありません。そして、私は、パックされた引数の1つ/すべて/すべてを名前で渡す方法を理解できませんでした。おそらく不可能です。

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

これは明らかにだけでなく、奇妙な実装の詳細ではありません:あなたは慎重にgrammarを読めば、特にfpdefが何であるか、あなたはその関数の定義が明示的にタプル解凍のために設計されている参照してください。

私の質問は、なぜこれが設計上の選択であり、必要な場合の使用例ですか?私には、python 1,2,3,5,7,9,13,17の禅に違反するあいまいでエラーを起こす傾向があるようです....

答えて

3

この機能は、通常の変数代入で行うことができます。この機能は完全に不要です。 Python 3ではremovedでした。なぜなら、多くを追加していないし、イントロスペクションを面倒にしてしまったからです。

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

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

+0

ありがとうKevin。そのPEPはまさに私が探していたものでした。 – wim

+0

このPEPの結果の1つは、Python 2.7で動作していた 'sort(seq、key = lambda(a、b):a * b)'がPython 3の構文エラーです。 – wim

関連する問題