最近沉迷於 MIT 6.824 這門分佈式系統的課,無心寫文章。不過看到 PEP570 被接受了,決定還是寫篇水文隨便聊聊 PEP 570
Python 的 argument#
在聊 PEP570 之前,我們先要來看看 Python 的 argument 變遷
早在 Python 1.0 或更早,Python 的 argument 系統就已經支持我們現在主要使用的兩種參數形式了,一種是 positional 一種是 keyword,舉幾個例子
def abc(a, b, c):
pass
abc(1, 2, 3)
abc(1, 2, c=3)
abc(1, b=2, c=3)
abc(*(1, 2, 3))
abc(**{"a": 1, "b": 2, "c": 3})
這是不是我們常見的集中使用方式?
在發展了很長一段時間後,雖然期間有一些提案對 Python 的 argument 系統做優化和增強,但是一直都被 Reject,直到 PEP3102 的出現
3102 主要引入了一個概念叫做 Keyword-Only Arguments,給個例子
有這樣一個函數定義
def abc(a, *, b, c):
pass
那麼這個函數只支持這樣幾種方式調用
def abc(a, *, b, c):
pass
abc(**{"a": 1, "b": 2, "c": 3})
abc(a=1, b=2, c=3)
abc(1, b=2, c=3)
OK,大概聊完 Argument 一個迭代的過程,我們來聊聊 570 這個提案
隨便聊聊 PEP 570#
570 做的事情其和 3102 類似,3102 是引入語法糖,讓函數支持 keyword-only 的使用方式,那麼 570 就是讓函數支持 positional-only 的使用方式
假定有這樣一個函數定義
def abc(a, b, /, c):
pass
那麼 570 使得函數只支持這樣的調用方式
def abc(a, b, /, c):
pass
abc(1, 2, c=3)
abc(1, 2, 3)
如果不這樣做會怎麼樣呢?我們可以來試試,目前 PEP570 有一個實現,參見 bpo-36540: PEP 570 -- Implementation,我們來編譯測試一下,效果如下
碎碎念#
很多人其實沒想清楚關於 570 的存在意義,PEP 570 上也提到了很多 Motivation 。不過我自己覺得,它和 3102 一樣都是在践行一個理念,則
explicit is better than implicit
換句話說,如果要盡可能的保證代碼風格的一致性,我們需要一定程度上語法特性的支持。而 570 和 3102 就是解決這樣的問題。
所以從我自己的角度來說,我覺得 570 是個蠻重要的提案,也是很有意義的提案(都是 PEP57x ,為啥大家待遇能差這麼多呢?(笑
對了,講個段子, Python 的 Core 之一 Serhiy Storchaka 非常喜歡這個 PEP,然後在 PEP570 的實現沒合併到主分支之前,就已經先把內置的一些庫給改良了一下,大家可以去圍觀一下 PR [WIP] Use PEP 570 syntax for positional-only parameters
好了,今天的水文就到此結束了。。我寫文章真的是越來越水了。。