web-dev-qa-db-ja.com

Python returnステートメントでのタプルの展開

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

もちろん、戻り値を括弧で囲む必要はありませんが、通常、いくつかの可能な結果(グループ化)を区別するためにのみ追加の括弧が必要です。ここでは、括弧を省略しても他の不要な動作は発生せず、動作はまったく発生しないため、これは当てはまりません。

63
jmd_dk

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 を提出しました(そして歩留まり)開梱。

29
David Cuthbert