普段はPythonの最新の開発動向は追いかけていない私ですが、たまたまTwitterで
Pythonの生みの親Guido van Rossumの下記のツイートを目にしました。
PEP 572 accepted. https://t.co/N9lKeDs7e5
— Guido van Rossum (@gvanrossum) July 12, 2018
何気なくこのPEP 572を斜め読んで、結構大胆な拡張だなぁ、などとその時は思っていました。
今日たまたま、Rubyの生みの親まつもとゆきひろ氏がこんなツイート
BFDL引退して、大食いユーチューバーを見てるってのは、それはそれで正しい生き方だな
— Yukihiro Matsumoto (@yukihiro_matz) July 13, 2018
をしているのを見つけて、YoutuberっていうのはGuidoのこのツイート
My new favorite YouTube channel. https://t.co/JlTTtMLeNI
— Guido van Rossum (@gvanrossum) July 5, 2018
のことを指していると分かったのですが、GuidoがBDFLを引退っていうところにびっくりして調べてみました。
BDFLは、Benevolent Dictator For Lifeの略で優しい終身の独裁者と訳されていますが、この言葉自体Guidoが使い始めたらしいです。
Pythonの言語仕様の拡張に関する提案は、PEPn (nは番号) という文書に記述されていますが、これらの提案を受け入れるか棄却するか、最終的に決定するというのが、今までのGDFLとしてのGuidoの役割でした。BDFLの役割や、PEPのドラフトやレビューといった言語仕様変更の手続き自体、PEP1に書かれています。
生みの親がそれを辞めるというのですから大事ですが、その理由が、PEP572の議論だったそうです。詳しくはこの記事に書いてありますが、要はPEP572での論争があまりにも激し過ぎて疲れ果てたし、自分の判断を嫌う人たちを見たくない、ということが理由ということです。
PEP572
そんな未曽有の大論争を巻き起こしたPEP572は何についてかというと、代入式の追加です。
今までPythonでは名前への代入は文しかなく、代入式はありませんでした。PEP 572により、
NAME := expr
という代入式が新たに導入されることになります。正確にはnamed expressionという
式の値が右辺のexpr
の評価値で、副作用として同じ値に左辺の名前が付きます。新たなスコープは導入されません。
PEP572に挙げられている例は、
# Handle a matched regex
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]
といったもので、確かに、cみたいに代入式が使えれば、同じものを二度評価したりしなくてもよかったり、もっと文が短くなるのに…と思うことはありました。
PEP572は、Python 3.8に反映される予定です。