python命名規則 PEP8編碼規則(約定俗成)
20150408 Chenxin
20181030 update
文件名 myfile.py
全小寫,可使用下划線
包 mypackage 模塊 mymodule
應該是簡短的、小寫的名字。如果下划線可以改善可讀性可以加入。
類 class MyClass
總是使用首字母大寫單詞串。內部類可以使用額外的前導下划線。比如類似 類使用ClassWords的方式,模塊內部使用的類采用_ClassWords的方式。
類的屬性(方法和變量)命名使用全部小寫的方式,可以使用下划線。
類的屬性有3種作用域public、non-public和subclass API
類的屬性若與關鍵字名字沖突,后綴一下划線,盡量不要使用縮略等其他方式。
為避免與子類屬性命名沖突,在類的一些屬性前,前綴兩條下划線。比如:類Foo中聲明__a,訪問時,只能通過Foo._Foo__a,避免歧義。
函數與方法 my_function
函數名應該為小寫,可以用下划線風格單詞以增加可讀性。如:myfunction,my_example_function。
函數和方法的參數 self cls test_
使用“self”作為實例方法的第一個參數。
使用“cls”作為類方法的第一個參數(也就是靜態方法第一個參數必須是cls)
如果一個函數的參數名稱和保留的關鍵字沖突,通常使用一個后綴下划線好於使用縮寫或奇怪的拼寫。如 args_ ,test_
全局變量
對於from M import X 導入語句.
全局變量盡量只在模塊內有效,類似C語言中的static。實現方法有兩種,一是__all__機制;二是前綴一個下划線。
變量 color
變量名全部小寫,由下划線連接各個單詞。如color = WHITE,this_is_a_variable = 1
注意:
1.不論是類成員變量還是全局變量,均不使用 m 或 g 前綴。
2.私有類成員使用單一下划線前綴標識,多定義公開成員,少定義私有成員。
3.變量名不應帶有類型信息,因為Python是動態類型語言.如 iValue、names_list、dict_obj 等都是不好的命名。
常量 TOTAL
常量命名使用全部大寫的方式,可以使用下划線如MAX_OVERFLOW,TOTAL。
異常
以“Error”作為后綴。即CapWords+Error后綴的方式。
縮寫 ExampleFunc
命名應當盡量使用全拼寫的單詞,縮寫的情況有如下兩種:
1.常用的縮寫,如XML、ID等,在命名時也應只大寫首字母,如XmlParser。
2.命名中含有長單詞,對某個單詞進行縮寫。這時應使用約定成俗的縮寫方式。例如:function 縮寫為 fn object 縮寫為 obj
文檔描述
1 為所有的共有模塊、函數、類、方法寫docstrings;非共有的沒有必要,但是可以寫注釋(在def的下一行)。
2 如果docstring要換行,參考如下例子
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
注釋
總體原則,錯誤的注釋不如沒有注釋。所以當一段代碼發生變化時,第一件事就是要修改注釋!
1.塊注釋,在一段代碼前增加的注釋。在‘#’后加一空格。段落之間以只有‘#’的行間隔。塊注釋還可以用文檔描述的方式 ''' xxx(xxx可以多行) '''
2.行注釋,在一句代碼后加注釋。比如:x = x + 1 # Increment x 但是這種方式盡量少使用。
3.避免無謂的注釋。
空格的使用
總體原則,避免不必要的空格。
1 各種右括號前不要加空格。xxx] xxx)
2 逗號、冒號、分號前不要加空格。xxx, xxx;
3 函數的左括號前不要加空格。如Func(1)。
4 序列的左括號前不要加空格。如list[2]。
5 操作符左右各加一個空格,不要為了對齊增加空格。
6 函數默認參數使用的賦值符左右省略空格。
7 不要將多句語句寫在同一行,盡管允許使用‘;’。
8 if/for/while語句中,即使執行語句只有一句,也必須另起一行。
代碼編排
1 縮進。4個空格的縮進。
2 每行最大長度79,換行可以使用反斜杠"",最好使用圓括號。換行點要在操作符的后邊敲回車。
3 類和top-level函數定義之間空兩行;類中的方法定義之間空一行;函數內邏輯無關段落之間空一行;其他地方盡量不要再空行。
文檔編排
不要在一句import中多個庫,比如import os, sys不推薦。
如果采用from XX import XX引用庫,可以省略‘module.’,都是可能出現命名沖突,這時就要采用import XX。
其他建議(優化)
1 避免單獨使用小寫字母‘l’,大寫字母‘O’容易混淆的字母。
2 編碼中考慮到其他類型python實現的效率問題,比如運算符‘+’在CPython(Python)中效率很高,Jython中卻非常低,所以應該采用.join()的方式。
3 盡可能使用‘is’‘is not’取代‘==’,比如if x is not None 要優於if x。
4 使用基於類的異常,每個模塊或包都有自己的異常類,此異常類繼承自Exception。
5 異常中不要使用裸露的except,except后跟具體的exceptions。
6 異常中try的代碼盡可能少。比如:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
要優於
try:
Too broad!
return handle_value(collection[key])
except KeyError:
Will also catch KeyError raised by handle_value()
return key_not_found(key)
7 使用startswith() and endswith()代替切片進行序列前綴或后綴的檢查。比如:
Yes: if foo.startswith('bar'):優於
No: if foo[:3] == 'bar':
8 使用isinstance()比較對象的類型。比如
Yes: if isinstance(obj, int): 優於
No: if type(obj) is type(1):
9 判斷序列空或不空,有如下規則
Yes: if not seq:
if seq:
優於
No: if len(seq)
if not len(seq)
10 字符串不要以空格收尾。
11 二進制數據判斷使用 if boolvalue的方式。