天天看點

Python 常用 PEP8 編碼規範和建議目錄代碼布局程式設計建議

<a href="#%E7%9B%AE%E5%BD%95">目錄</a>

<a href="#%E4%BB%A3%E7%A0%81%E5%B8%83%E5%B1%80">代碼布局</a>

<a href="#%E7%BC%A9%E8%BF%9B">縮進</a>

<a href="#%E6%9C%80%E5%A4%A7%E8%A1%8C%E5%AE%BD">最大行寬</a>

<a href="#%E7%A9%BA%E8%A1%8C">空行</a>

<a href="#%E6%A8%A1%E5%9D%97%E5%AF%BC%E5%85%A5">子產品導入</a>

<a href="#%E5%AD%97%E7%AC%A6%E4%B8%B2">字元串</a>

<a href="#%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%92%8C%E8%AF%AD%E5%8F%A5%E4%B8%AD%E7%9A%84%E7%A9%BA%E6%A0%BC">表達式和語句中的空格</a>

<a href="#%E6%B3%A8%E9%87%8A">注釋</a>

<a href="#%E5%91%BD%E5%90%8D%E8%A7%84%E5%88%99">命名規則</a>

<a href="#%E7%BC%96%E7%A8%8B%E5%BB%BA%E8%AE%AE">程式設計建議</a>

每級縮進用4個空格。

括号中使用垂直隐式縮進或使用懸挂縮進。

EXAMPLE:

錯誤示範:

每行最大行寬不超過 79 個字元

一般續行可使用反斜杠

括号内續行不需要使用反斜杠

兩行空行用于分割頂層函數和類的定義

單個空行用于分割類定義中的方法

導入的每個子產品應該單獨成行

導入順序如下: (各子產品類型導入之間要有空行分割,各組裡面的子產品的順序按子產品首字母自上而下升序排列)

标準庫

相關的第三方庫

本地庫

錯誤示例:

單引号和雙引号作用是一樣的,但必須保證成對存在,不能夾雜使用.

(建議句子使用雙引号, 單詞使用單引号, 但不強制.)

括号裡邊避免空格

逗号,冒号,分号之前避免空格

函數調用的左括号之前不能有空格

指派等操作符前後不能因為對齊而添加多個空格

二進制運算符兩邊放置一個空格

涉及 = 的複合操作符 ( += , -=等)

比較操作符 ( == , &lt; , &gt; , != , &lt;&gt; , &lt;= , &gt;= , in , not in , is , is not )

邏輯操作符( and , or , not )

注釋塊

注釋塊通常應用在代碼前,并和代碼有同樣的縮進。每行以 ‘# ’ 開頭, 而且#後面有單個空格。

單行注釋(應避免無謂的注釋)

文檔字元串

包和子產品名:

包和子產品名應該簡短,全部用小寫字母, 多字母之間可以使用單下劃線連接配接。

類名:

遵循駝峰命名

全局變量名:

全局變量名應盡量隻在子產品内部使用, 對可能使用語句 <code>from moduleName import variableName</code> 而被導入的子產品,應采用 <code>__all__</code> 機制來防止全局變量被别的子產品導入, 或者在全局變量名開頭加一個前置下劃線.

函數名

函數名應該為全部小寫的凹駝峰規則。

常量名

常量全部使用大寫字母的凹駝峰規則來表示, 通常在子產品頂格定義

方法名和執行個體變量

非公開方法和執行個體變量開頭使用前置下劃線

有時候可能會為了避免與子類命名沖突,采用兩個前置下劃線

需要注意的是: 若 class Foo 的屬性名為 <code>__a</code>, 該屬性是不能以 <code>Foo.__a</code> 的方式通路的(執著的使用者還是可以通過<code>Foo._Foo__a</code> 來通路), 是以通常雙前置下劃線僅被用來避免與基類的屬性發生命名沖突。

None 的比較用 is 或 is not,而不要用 ==

用 is not 代替 not … is, 前者的可讀性更好

使用函數定義關鍵字 def 代替 lambda 指派給辨別符, 這樣更适合于回調和字元串表示

異常類應該繼承自Exception,而不是 BaseException

Python 2 中用<code>raise ValueError('message')</code> 代替 <code>raise ValueError, 'message'</code>

(考慮相容python3和續行的友善性)

捕獲異常時盡量指明具體異常, 盡量不用 <code>except Exception</code>, 應該捕獲 出了什麼問題,而不是 問題發生

try/except 子句中的代碼要盡可能的少, 以免屏蔽掉其他的錯誤

函數或者方法在沒有傳回值時要明确傳回 None

使用字元串方法而不是 string 子產品

python 2.0 以後字元串方法總是更快,而且與 Unicode 字元串使用了相同的 API

使用使用 <code>.startswith()</code> 和 <code>.endswith()</code> 代替字元串切片來檢查字首和字尾

<code>startswith()</code> 和 <code>endswith</code> 更簡潔,利于減少錯誤

使用 <code>isinstance()</code> 代替對象類型的比較

空序列類型對象的 bool 為 False:

不要用 == 進行 bool 比較