Manjusaka

Manjusaka

隨便聊聊 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,我們來編譯測試一下,效果如下

image

碎碎念#

很多人其實沒想清楚關於 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

好了,今天的水文就到此結束了。。我寫文章真的是越來越水了。。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。