web-dev-qa-db-ja.com

Pythonのスプラット演算子*および**はどこで有効ですか?

解凍/スプラット演算子*および**は、pythonバージョン(2.7、3.x <3.5および3.x> = 3.5))間で適用性が大きく異なります。

例えば:

                                   |   2.7    |   3.1-3.4  |   3.5   
----------------------------------------------------------------------
function(*args)                         ✓            ✓          ✓    

x, *y, z = [1, 2, 3, 4, 5]              x            ✓          ✓    

{**x, **y}                              x            x          ✓    

私が見逃したさまざまなバージョンの間に他の矛盾はありますか?私はPEPとReadmesを調べていますが、ドキュメントはこれで詳しく説明されていません。

17
cs95

1992年頃(Pythonバージョンについては不明)。これは Python 1.0.1 の文法ファイルからのものです。

# 06-Apr-92:
#   Use only '*' for varargs list

# 31-Mar-92:
#   Tighten syntax for try statements

# 27-Feb-92:
#   Allow NEWLINE* after eval input

# 16-Jan-92:
#   Added '*' as alternative for '+' in varargs syntax
#   (Not sure which alternative is better yet.)

# 11-Jan-92:
#   Variable length argument list syntax added: def f(a, b, +rest): ...

Python 1.4 +

キーワード引数:Pythonで記述された関数とメソッドは、keyword = value形式のキーワード引数を使用して呼び出すことができます。

Python 1.6 +

apply() 関数の代わりに使用できる特別な構文があります。 f(*args, **kwds)apply(f, args, kwds)と同等です。バリエーションf(a1, a2, *args, **kwds)を使用することもできます。f(*args)f(**kwds)のいずれかを省略することもできます。

Python <= 2.7

タプルパラメータのアンパックは、Python 3.0で削除されました。

PEP 311タプルパラメーターのアンパックが削除されました。def foo(a, (b, c)): ...を書き込むことができなくなりました。代わりにdef foo(a, b_c): b, c = b_cを使用してください。

Python 3.0 +

PEP 3132Extended Iterable Unpacking。これでa, b, *rest = some_sequenceのようなものを書くことができます。そして*rest, a = stuffですら。残りのオブジェクトは常に(おそらく空の)リストです。右側は反復可能です。

PEP 3102キーワードのみの引数パラメータリストの*argsの後に発生する名前付きパラメータは、コール。また、パラメーターリストで裸の*を使用して、可変長の引数リストを受け入れないが、キーワードのみの引数があることを示すことができます。

Python 3.5 +

PEP 448 、追加のアンパックの一般化。


私が知る限り、すべての構文の変更をリストする単一のページはありません。バージョンごとの構文の変更は Pythonの新機能 セクションにリストされています。または、各リリースの文法仕様を確認して違いを確認することもできます。

22