Python中必讀的PEP提案

劉志軍發表於2018-08-08

什麼是PEP

PEP 是 Python 增強提案(Python Enhancement Proposal)的縮寫。社群通過PEP來給 Python 語言建言獻策,每個版本你所看到的新特性和一些變化都是通過PEP提案經過社群決策層討論、投票決議,最終才有我們看到的功能。

0、PEP8

如果你還不知道PEP8是什麼,可能還算不上一位合格的Python程式設計師,PEP8是每個Python程式設計師必讀的提案,Python雖然以語法簡潔著稱,但並不意味著你就一定能寫出簡潔優雅的程式碼,PEP8風格指南定義了編寫 Python 程式碼的規範和應該遵守的編碼原則,大家都應該按照此規範約束程式碼,多讀幾遍此規範,做到了然於心。網上有各種版本的中譯版,可選擇性參考閱讀。

什麼是Python?

有個通用的約定應該是可維護的、清晰可懂的、滿足一致性的,同時也應該是好的程式設計習慣的基礎。它不會違揹你的意願來強制要求你遵循那些規則。這就是Python!" -- Tim Peter

地址:https://www.python.org/dev/peps/pep-0008/

1、PEP257

除了PEP8,還有 PEP257 是編寫可維護程式碼的一份提案,它是用來指導程式設計師如何規範書寫文件說明(Docstring) 的提案。我們知道Python是動態語言,動態語言的優點是程式碼簡潔,但是缺乏約束性,所以很多時候需要通過文件說明來對程式碼進行說明才知道方法的引數需要什麼型別,返回值是什麼型別。但是這種方式有弊端,大部分程式設計師不喜歡寫文件,又接受不了別人不寫文件。

地址:https://www.python.org/dev/peps/pep-0257/
中譯版:https://my.oschina.net/LuCastiel/blog/1552148

2、PEP20

說到Python裡面隱藏的彩蛋,PEP20算得上一個,在Python終端匯入this模組,有二十條(其實是19條)關於Python程式設計的禪學,還沒看過的可以在Python命令列輸入 import this 試試,諷刺的是,this 模組的原始碼晦澀難懂,這也是作者想從側面來說明程式碼可讀性的意義。

Python中必讀的PEP提案

地址: https://www.python.org/dev/peps/pep-0020/

3、PEP 557

PEP 557 是最近 Python3.7 中加入的新特性,叫做資料類(data class),此舉是讓程式設計師寫更少的程式碼,以前定義一個類,如果這個有很多屬性要初始化的話,敲鍵盤敲到你手痠,比如以前定義一個類:

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
複製程式碼

那些魔術方法你全部要手動實現,現在不要了,你只要在類上面加一個裝飾器 @dataclass

from dataclasses import dataclass

@dataclass
class DataClassCard:
    rank: str
    suit: str
複製程式碼

它和上面的程式碼段是完全等價的,是不是瞬間對Python又多一份愛了

地址:https://www.python.org/dev/peps/pep-0557/

4、 PEP 435

列舉在 Python2 中被認為是一個沒用的東西,打臉的是社群覺得列舉還是有存在的必要,於是 PEP 435 就專門新增了一種列舉型別,話說,在現代程式設計中,沒有列舉真的不能稱之為一門完整的語言。

>>> from enum import Enum
>>> class Color(Enum):
...     red = 1
...     green = 2
...     blue = 3
複製程式碼

地址:https://www.python.org/dev/peps/pep-0435/

5、 PEP 3156

PEP 3156 是Python 3.4 中引入非同步I/O框架 asyncio 的一個提案,提供了基於協程做為非同步I/O編寫單執行緒併發程式碼的基礎設施。隨後在 PEP492 中引入了 async/await 語法 以及 PEP380 中的yield from 語法,自此,Python有了原生的協程支援。

地址:https://www.python.org/dev/peps/pep-3156/

6、 PEP 484

Python是一門動態語言,返回值、變數、引數都無需指定型別,解析器在執行的時候會自動判斷其型別,某種程度上讓程式碼變得更簡潔,與此同時,帶來的副作用就是在多人合作,bug定位和程式碼可讀性等方面不方便,所以前面介紹的 PEP257 就是通過文件來規範程式碼,但是文件是非強制性的,你不寫對程式碼的執行一點影響也沒有,所以 PEP 484 (Python3.5 引入)從程式碼層面上加入了靜態語言的部分特性---型別提示(Type Hints),你現在可以在函式、方法、類的引數和返回值宣告其型別。與之類似還有 PEP526,526 是提案給變數指定型別的。

def greeting(name: str) -> str:
    return "Hello, {}!".format(name)
複製程式碼

現在你會明白,Java作為靜態語言的優勢了吧。

地址:https://www.python.org/dev/peps/pep-0484/

7、PEP 572

PEP 572 是關於表示式賦值的提案,語法是這樣的:

while chunk := file.read(8192):
   process(chunk)
複製程式碼

該提案在社群爭議性比較大,就是因為這個提案讓 Python 之父憤然退出 Python 核心決策層,因為這個提案與社群其他成員產生了比較大的分歧。雖然Python之父不再是 BDFL,但是該提案最終還是被納入到 Python3.8 中釋出。

地址:https://www.python.org/dev/peps/pep-0572/

8、PEP 404

PEP 404 正如其名,一個關於 Python2.8 版本號不存在的提案,Python之父曾說過,如果Python3要相容Python2,可能這個專案已經失敗了,因為Python2有太多的歷史包袱,所以Python2.7將成為Python2的終結版本號,所有的新特新將加入到Python3中。

地址:https://www.python.org/dev/peps/pep-0404/

9、 PEP 0

說到必看的 PEP,可能遠不止我上面列的這些,於是有一個專門的PEP是用來索引所有PEP的集合。

地址:https://www.python.org/dev/peps/pep-0000/

以上每個PEP8都可以長篇大論一番,鑑於篇幅有限只能做到拋磚引玉,還請讀者自行對每個不瞭解的PEP深入學習並掌握。

部落格: foofish.net
公眾號:Python之禪

相關文章