重要的事情說三遍:可讀性很重要;
PEP8規(guī)范要點筆記:
一、代碼布局問題
1.縮進
每一級縮進四個空格。
參數(shù)縮進案例如下:
# Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
var_three, var_four)
# More indentation included to distinguish this from the rest.
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
# Hanging indents should add a level.
foo = long_function_name(
var_one, var_two,
var_three, var_four)
2.空格和制表符
絕對不要混合使用制表符和空格,可以用python -t來檢查是否存在混合使用的情況,混合使用容易造成問題。
3.行的最大長度
限制所有行的最大長度為79個字符,
4.空行
頂層函數(shù)和類之間兩個空行
類的方法之間一個空行
謹(jǐn)慎的使用空行,將相關(guān)函數(shù)一組組的分割開來,謹(jǐn)慎意味著盡量少用
函數(shù)或者方法體內(nèi),謹(jǐn)慎的使用空行,表示不同的邏輯段落,謹(jǐn)慎意味著盡量少用
5.編碼
python2.x的核心編碼為ascII或者latin-1(iso-8859-1)編碼,而python3的編碼方式為utf-8,
6.導(dǎo)入
導(dǎo)入模塊module使用單獨的行
import os,sys應(yīng)該改為如下方式
import os
import sys
導(dǎo)入同一個包或者模塊的類
from subprocess import? Popen,PIPE
導(dǎo)入順序:分三組導(dǎo)入,組與組之間用一個空行分割
standard library imports 標(biāo)準(zhǔn)庫導(dǎo)入
related third party imports 相關(guān)第三方導(dǎo)入
local application/library specific imports 本地應(yīng)用程序/庫的特定導(dǎo)入
絕對路徑:不推薦使用.相對路徑,推薦絕對路徑導(dǎo)入
防止命名沖突的方法:
import myclass
import foo.bar.yourclass
二、表達式和語句中的空格問題
1. 表達式中盡量避免空格:
2. 緊貼在三種括號前
3. 緊貼在逗號,分號,冒號前,但是之后留一空格以便閱讀
4. 二元運算符,以及算數(shù)運算符前后一個空格即可,不要多余空格
5. 關(guān)鍵字參數(shù)不要前后增加一個空格。
三、注釋
1. 首字母大寫,句號結(jié)尾,結(jié)尾后兩個空格。英語注釋。(國內(nèi)還是習(xí)慣中文,雖然官方建議英文注釋。)
2. 塊注釋,以#開頭,其后緊跟一個空格
3. 行內(nèi)注釋,與執(zhí)行語句相隔至少兩個空格,以#開頭,其后緊根一個空格。
4. 編寫良好的文檔字符串,這很有意義。
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
四、命名風(fēng)格
1. 不用l(L的小寫),I(大寫的i),O(大寫的o),做變量名
2. 從大到小,項目名稱,包名,模塊名,類名,函數(shù)名,變量名,參數(shù)名
? ? 項目名稱隨意
? ? 包名,模塊名,小寫,可用下劃線分割,便于閱讀
? ? 類名,首字母大寫,內(nèi)部類建議加上前導(dǎo)下劃線
? ? 異常,異常也是類,首字母大寫,而且添加Error作為自定義異常的名稱后綴,方便后續(xù)引用。
? ? 函數(shù)名,小寫,可用下劃線分割
? ? 變量名,小寫,可用下劃線。如果是常量的話,全部大寫。
? ? 參數(shù)名,參數(shù)名如果與保留字沖突,建議結(jié)尾下劃線。
3. 下劃線規(guī)則
? ? 私有方法和實例變量,使用單下劃線開頭
? ? 使用前導(dǎo)雙下劃線調(diào)用Python的名字變化規(guī)則來避免與子類中的名字沖突
4. 用戶代碼不應(yīng)定義以Py或_Py開頭的名稱,此類型名稱python內(nèi)部使用來確定函數(shù)是Python/C API函數(shù)。如果用戶自用,會危及用戶代碼對未來Python版本的可移植性。
五、程序設(shè)計建議
建議1. 例如,不要依賴于CPython的高效內(nèi)置字符連接語句a += bora = a + b.這些語句在Jython中運行較慢。在性能敏感的庫中,應(yīng)該用''.join()來取代。這樣可以保證在不同的實現(xiàn)中,字符鏈接花費的時間都呈線性。
建議2. 與諸如None這樣的字符比較時,要使用is or is not,永遠不要用等于操作。
# 以下語句執(zhí)行成功,None
str =""
ifstris not None:
print("空字符串不等于None")
建議3. 為了實現(xiàn)復(fù)雜的排序操作,最好通過實現(xiàn)6個操作六個操作(__eq__,__ne__,__lt__,__le__,__gt__,__ge__)完成,而非自定義一些特別的代碼
建議4. 使用Based-object Exception,自定義類應(yīng)該繼承Exception,并且Error后綴名,非錯誤類異常可以不用Error后綴。
class MessageError(Exception):
"""Base class for errors in the email package."""
使用具體的異常聲明代替光禿禿的的exception:。例如:(ps:若想捕捉所有異常,至少使用except Exception:)
try:
import platform_specific_module
except ImportError:
platform_specific_module = None
建議5. 關(guān)于字符串操作
使用String方法而非String模塊
使用''.startswith()和''.endswith()而非字符切片去檢測前綴或后綴。
建議6. 對象類型比較使用isinstance()方法
檢查一個變量是否字符串類型的方法:if isinstance(obj, basestring):
建議7.對于序列,(strings, lists, tuples),利用空序列為false這一點,作為判斷條件
if not seq:
if seq:
建議8. 別用‘==’進行布爾值和 True 或者 False 的比較
六、引用
七、docString,代碼字符串和pydoc的使用
單行文檔字符串,建議首字母大寫,尾部句號,感嘆號結(jié)尾。例如:
defreverse_sort(items):
"""Sort items in reverse order."""
多行注釋要求:第一行概述,首字母大寫,句號結(jié)尾
第二行空行
第三行細(xì)節(jié)描述,同時注意與第一行的第一個引號對齊,最后"""結(jié)尾
"""OS routines for NT or Posix depending on what system we're on.
This exports:
......
"""
更多細(xì)節(jié),請參考Github開源項目python編碼風(fēng)格指南