跳到主要內容

PEP 572爭議事件,以及個人對PEP 572 (Python 3.8) 的看法

前情提要


PEP 572是python 3.8 中的一個feature (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
開了這個洞給程式碼,一定會有非常恐怖的程式碼出現


如同以下的程式碼,我們已經可以預測未來不久就會有這種寫法誕生在各個project上


if foo := bar(x):
    print(foo)
簡單來說也就是在 "表達式裡面嵌入賦值" 的語法的方法。

結論


以上介紹應該就能理解他的用意,我個人雖然是挺贊同這種寫法,能夠變得方便許多。

但是重點不在於方便性,而是在於語法的"複雜"度。

對剛踏入Python的初學者來說,是極有可能會將此Assignment Expressions搞混其正確的用法

也因為如此,這場表決戰爭就開打了,有人表示贊同Guido同意這突如其來的Feature,也有人批評了Python的syntax沒有嚴加控管,導致寫法越來越奔放,可讀性越來越差。

正方表示


  • 就像f-string這個feature一樣,其實大家看的不夠遠,這對未來是有幫助,諸如等等
  • C++也常用這種方式不是嗎?


反方表示


  • 不符合Python之禪,不過Python之禪的作者也沒有覺得是什麼大問題。
  • 應該要大幅度的限制此語法的scope,保持簡易性
  • 大眾普遍會認為":="是一個定義,不是賦值,


當然以上的評論都能演化成讓「仁慈獨裁者」Guido的不滿,而進而從Python決策層中退位,個人認為這實在是沒有必要。

最終到現在,誰對誰錯不是那麼明顯,看起來社群還是是有給一些建設性的建議,只不過Guido吞不下這口氣就下台一鞠躬了,雖然Python社群已經非常狀大,但這還是會造成Python發展的速度吧

而我覺得如果身在其位要將Feature推出去時,被社群的每個人吐槽、批評,好像不是那麼好受,社群的所有人如果能夠站在決策者的立場想一想,以不要那麼激進的口吻進行推動並改進,是不是就不會造成這種後果?













留言