Python言語(特に3.x)では、イテラブルの非常に一般的なunpackingが許可されます。
a, *rest = 1, 2, 3
長年にわたり、この展開は徐々に一般化されてきました(たとえば PEP 3132 および PEP 448 を参照)、より多くの状況で使用できるようになりました。そのため、Python 3.6(およびPython 3.7)では無効のままです。
def f():
rest = [2, 3]
return 1, *rest # Invalid
返されたタプルを次のように括弧でカプセル化することで機能させることができます。
def f():
rest = [2, 3]
return (1, *rest) # Valid
return
ステートメントでこれを使用するという事実は、次のように重要なようです。
t = 1, *rest
確かに合法であり、括弧の有無にかかわらず同じ結果になります。
このケースは、単にPython開発者によって忘れられましたか、このケースが無効な構文である理由はありますか?
これは、Python言語。
def f():
rest = [2, 3]
t = 1, *rest
return t
通常、このようなコードがある場合、t
は一時的な名前であると見なします。これは、最終行のt
をその定義で置き換えるだけでなくすことができるはずです。ただし、この場合、これは無効なコードにつながります
def f():
rest = [2, 3]
return 1, *rest
もちろん、戻り値を括弧で囲む必要はありませんが、通常、いくつかの可能な結果(グループ化)を区別するためにのみ追加の括弧が必要です。ここでは、括弧を省略しても他の不要な動作は発生せず、動作はまったく発生しないため、これは当てはまりません。
this commit for Python 3.2。
そのコミットにより、割り当て式がtestlist_star_expr
production(括弧なしのアンパックを許可するもの)ですが、returnステートメントはtestlist
productionを取ります。私はコミットがこれを逃したと思われます(そしておそらく他の場所ですが、私はreturn_stmt
現在のところ生産)。
先に進み、Python Grammar/Grammarファイルを変更してこれを許可しました。test_grammar.py
ファイル(ただし、これはひどく網羅的ではないようです)。
興味があれば、 これは私が行った変更です 。クローンまたはダウンロードしてください my fork 。
UPDATE:返品について bpo issue および pull request を提出しました(そして歩留まり)開梱。