概要#
PEP 572 は Python 3.8 の機能(Assignment Expressions)です。
そして、この Assignment Expressions の構文が最近 Python のエコシステムで大きな議論を巻き起こしています。まず、この変更が何を意味するのか説明します。
まず、PEP 572 の紹介を以下に示します。
In most contexts where arbitrary Python expressions can be used, a named expression can appear. This is of the form NAME := expr where expr is any valid Python expression other than an unparenthesized tuple, and NAME is an identifier.
以下は例です。
if (match := pattern.search(data)) is not None:
# Do something with match
# A loop that can't be trivially rewritten using 2-arg iter()
while chunk := file.read(8192):
process(chunk)
# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]
この使用法では、変数の位置に制限はありません。以下のようになります。
def foo(answer = p := 42): # INVALID
...
def foo(answer=(p := 42)): # Valid, though not great style
...
したがって、次のようにも書くことができます。
def foo(answer: p := 42 = 5): # INVALID
...
def foo(answer: (p := 42) = 5): # Valid, but probably never useful
このようなコードの書き方が可能になったため、恐ろしいコードが必ず出現するでしょう。
以下のコードのように、私たちはすでに近い将来、さまざまなプロジェクトでこのような書き方が生まれることを予測することができます。
if foo := bar(x):
print(foo)
要するに、"式に代入を埋め込む" という構文の方法です。
結論#
上記の説明で彼の意図が理解できるはずです。私個人としては、このような書き方には賛成です。便利になることは間違いありません。
しかし、重要なのは便利さではなく、構文の "複雑さ" です。
Python に初めて入門する人にとって、この Assignment Expressions を正しく使いこなすことは非常に困難です。
そのため、この論争が勃発しました。Guido がこの突然の機能に同意する人もいれば、Python の構文が厳密に制御されていないため、書き方が自由になり、可読性が低下していると批判する人もいます。
賛成側は次のように主張しています。
-
f-string のようなこの機能も、みんなが見る範囲が狭すぎると思っています。これは将来に役立つものです。
-
C++ でもよく使われる方法ではありませんか?
反対側は次のように主張しています。
-
Python の哲学に合致していませんが、Python の哲学の作者もそれを大きな問題とは考えていません。
-
この構文のスコープを大幅に制限し、シンプルさを保つべきです。
-
一般的に ":=" は定義であると認識されますが、代入ではありません。
もちろん、上記のコメントは「慈悲深い独裁者」Guido の不満に発展する可能性があり、それによって Python の意思決定層から退場する可能性もあります。個人的には、それは本当に必要ないと思います。
最終的に、誰が正しいかは明確ではありません。コミュニティは建設的な提案をしているように見えますが、Guido はその気になれなかったため、一礼して退場しました。Python コミュニティは非常に大きいですが、それでも Python の開発の速度に影響を与えるでしょう。
私は、そのような機能を導入する際には、コミュニティのすべての人が批判や批判を受けることはあまり良くないと思います。決定者の立場に立って考え、より穏やかな口調で推進し改善することができれば、このような結果をもたらさないのではないでしょうか?