Python中必讀的PEP提案

什麼是PEPpython

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

0、PEP8

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

什麼是Python?編程

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

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

一、PEP257

除了PEP8,還有 PEP257 是編寫可維護代碼的一份提案,它是用來指導程序員如何規範書寫文檔說明(Docstring) 的提案。咱們知道Python是動態語言,動態語言的優勢是代碼簡潔,可是缺少約束性,因此不少時候須要經過文檔說明來對代碼進行說明才知道方法的參數須要什麼類型,返回值是什麼類型。可是這種方式有弊端,大部分程序員不喜歡寫文檔,又接受不了別人不寫文檔。異步

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

二、PEP20

說到Python裏面隱藏的彩蛋,PEP20算得上一個,在Python終端導入this模塊,有二十條(實際上是19條)關於Python編程的禪學,還沒看過的能夠在Python命令行輸入 import this 試試,諷刺的是,this 模塊的源代碼晦澀難懂,這也是做者想從側面來講明代碼可讀性的意義。函數

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

三、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/

四、 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/

五、 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/

六、 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/

七、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/

八、PEP 404

PEP 404 正如其名,一個關於 Python2.8 版本號不存在的提案,Python之父曾說過,若是Python3要兼容Python2,可能這個項目已經失敗了,由於Python2有太多的歷史包袱,因此Python2.7將成爲Python2的終結版本號,全部的新特新將加入到Python3中。

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

九、 PEP 0

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

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

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

博客: foofish.net
公衆號:Python之禪

相關文章
相關標籤/搜索