Red Huang

Red Huang

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推出去時,被社群的每個人吐槽、批評,好像不是那麼好受,社群的所有人如果能夠站在決策者的立場想一想,以不要那麼激進的口吻進行推動並改進,是不是就不會造成這種後果?
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。