前情提要
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推出去時,被社群的每個人吐槽、批評,好像不是那麼好受,社群的所有人如果能夠站在決策者的立場想一想,以不要那麼激進的口吻進行推動並改進,是不是就不會造成這種後果?
留言
張貼留言