隨便聊聊 PEP570
最近沉迷與 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
好了,今天的水文就到此結束了。。我寫文章真的是越來越水了。。