概要#
PEP 572 は Python 3.8 の新機能である「代入式(Assignment Expressions)」です。
最近、この代入式の構文が Python のエコシステムで大きな議論を巻き起こしています。まず、この変更が何を意味するのか説明します。
まず、PEP 572 の紹介を以下に示します。
ほとんどの Python 式が使用できる文脈では、名前付き式が使用できます。これは NAME := expr の形式で、expr はカッコで囲まれていないタプル以外の有効な Python 式であり、NAME は識別子です。
以下は例です。
if (match := pattern.search(data)) is not None:
# matchを使って何かを行う
# 2引数のiter()を使って簡単に書き換えられないループ
while chunk := file.read(8192):
process(chunk)
# 計算コストの高い値を再利用
[y := f(x), y**2, y**3]
この使用法では、変数の位置に制限はありません。以下のようになります。
def foo(answer = p := 42): # 無効
...
def foo(answer=(p := 42)): # 有効ですが、あまり良いスタイルではありません
...
したがって、次のようにも書くことができます。
def foo(answer: p := 42 = 5): # 無効
...
def foo(answer: (p := 42) = 5): # 有効ですが、おそらく決して役に立たないでしょう
このように、コードにこのような穴を開けると、非常に恐ろしいコードが出現することが予想されます。
以下のコードのように、近い将来、さまざまなプロジェクトでこのような書き方が生まれるでしょう。
if foo := bar(x):
print(foo)
要するに、「式に代入を埋め込む」という構文の方法です。
結論#
上記の説明で目的が理解できると思います。個人的にはこの書き方に賛成しています。便利になることは間違いありません。
しかし、重要なのは便利さではなく、構文の「複雑さ」です。
Python 初心者にとって、この代入式を正しく使いこなすことは非常に難しいかもしれません。
そのため、この議論が始まったのです。Guido がこの突然の機能に同意する人もいれば、Python の構文が厳密に制御されていないため、書き方が自由になり、可読性が低下していると批判する人もいます。
賛成側は次のように主張しています。
- f-string のようなこの機能は、みんなが十分に遠くを見ていないだけで、将来的に役立つものです。
- C++ でもよく使われる方法ではありませんか?
反対側は次のように主張しています。
- Python の哲学に合致していませんが、Python の哲学の作者もそれを大きな問題とは考えていません。
- この構文のスコープを大幅に制限し、シンプルさを保つべきです。
- 一般的に「:=」は定義であると認識され、代入ではありません。
もちろん、上記のコメントは「慈悲深い独裁者」Guido の不満に発展する可能性があり、それによって Python の意思決定層から退場する可能性があります。個人的には、それは本当に必要ないと思います。
最終的に、誰が正しく、誰が間違っているかは明確ではありません。コミュニティは建設的な提案をしているように見えますが、Guido はそれを受け入れることができず、一礼して退場しました。Python コミュニティは非常に大きいですが、それでも Python の発展の速度に影響を与えるでしょう。
私は、このような機能を導入する際に、コミュニティのすべての人が批判や批判を受けることはあまり良くないと思います。決定者の立場に立って考え、より穏やかな口調で推進し改善することができれば、このような結果は避けられるのではないでしょうか?