python-PEP8編碼規範
PEP8編碼規範
這篇博客是pep8的翻譯版
https://my.oschina.net/u/1433482/blog/464444
主要分為7部分
- 因為在開發過程中讀一定是讀代碼多於寫代碼,所以保持代碼的一致性很重要
1. 代碼布局
縮進:四個空格
方法中多參數的懸掛或者垂直縮進:在IDE中一行到末尾時選擇換行???,並在下一行多空格兩個,避免與下一級的語句沖突
if中多條件連接:跟上面多參基本一致
空格 or tab的選擇:用空格,在IDE中自動使用空格作為換行,如果自己在vim中編輯時,要用空格,保持一致
最大行寬:所有行的最大行寬為79個字符,如果是文本(如註釋)最大為72字符
空行:1.正常使用,作為分割邏輯快,不要使用過多的空行;2.在頂層函數與定義間用兩行空行
文件編碼的註意事項:py2中,默認是ascii編碼,而py3中是utf8編碼,用的是py2,所以盡量避免出現中文,保持ascii麽,還是規定編碼為utf8???
標準庫或者普通庫的導入:1.導入一個庫在單獨行;2.導入始終在文件的頂部,在模塊註釋和文檔字符串之後,在模塊全局變量和常量之前;3.導入順序:標準庫,第三方庫,本地庫。導入之間要有空行;4. 盡量使用絕對路徑導入???
2. 字符串引用
- python中雙引號與單引號字符串是相同的,而且盡量避免在字符串中寫反斜杠‘‘
3. 表達式和語句中的空格
不能使用空格的情況:1.括號內;2.逗號,冒號,分號前;3.索引切片操作符冒號前後???;4.函數名與括號之間;5.列表名與中括號之間;6.優先級較高的運算符左右,比如*;7.方法中默認參數賦值操作符左右;8.
要使用空格的情況:1.二元操作符左右;
冒號一般前面沒有,後面有
避免使用‘;‘作為連接兩個語句,盡量在一行不寫兩條語句
4. 註釋
在更新代碼時,優先更新註釋,不對應的註釋比沒註釋還要糟糕
註釋塊用#寫,每一行間用一個#隔開
註釋塊內的段落用僅包含單個 ‘#‘ 的行分割
文檔字符串,用於公共模塊、函數、類和方法中,必須寫上
‘#‘後面跟著一個空格
5. 版本標簽
- 如果你必須在源文件中包含git、Subversion、CVS或RCS crud信息,放置在模塊的文檔字符串之後,任何其他代碼之前,上下各用一個空行
__version__ = "$Revision$"# $Source$
6. 命名約定
前面有單下劃線:1.弱內部標誌:from M import不會導入的對象
後面有單下劃線:1.避免與關鍵字沖突
前面有雙下劃線:1.對類這樣命名的時候,會觸發名字重整
避免使用的名字:1.‘i‘,小寫i;2.‘I‘,大寫i;3.‘O‘,大寫o;
模塊名、包名:模塊名全部小寫,用下劃線連接;包名也是小寫,但是不用下劃線
類名:CapWord命名,也就是pascal風格,首字母大寫
異常名:在類名後添加Error
全局變量名:變量盡量只用於模塊內部,約定類似函數。對設計為通過 "from M import " 來使用的模塊,應采用 all 機制來防止導入全局變量;或者為全局變量加一個前置下劃線。???
函數名:小寫,必要時添加下劃線
函數和方法參數:實例方法第一個參數是 ‘self‘。類方法第一個參數是 ‘cls‘。
常量命名:大寫字母加下劃線
繼承命名:公開屬性應該沒有前導下劃線。
如果公開屬性名和保留關鍵字沖突,可以添加後置下劃線
簡單的公開數據屬性,最好只公開屬性名,沒有復雜的訪問/修改方法,python的Property提供了很好的封裝方法。 d.如果不希望子類使用的屬性,考慮用兩個前置下劃線(沒有後置下劃線)命名。
7. 編程中的建議
+盡量寫為.join()
none值比較盡量用is,is not 而不是用==
異常類繼承自Exception,而不是BaseException。
Python2中用" raise ValueError(‘message‘)"代替"raise ValueError, ‘message‘"
捕獲異常時盡量指明具體異常,而不是空"except:"子句
Python 2.6以後建議用as顯示綁定異常名
try:
process_data()
except Exception as exc:
raise DataProcessingFailedError(str(exc))
函數或者方法在沒有返回時要明確返回None。
使用字符串方法而不是string模塊。
使用使用 .startswith()和.endswith()代替字符串切片來檢查前綴和後綴
# Yes
if foo.startswith(‘bar‘):
# No
if foo[:3] == ‘bar‘:
- 使用isinstance()代替對象類型的比較:
# Yes
if isinstance(obj, int):
# Yes
if isinstance(obj, basestring):
# 字符串類型
# No
if type(obj) is type(1):
- 對序列(字符串、列表 、元組), 空序列為false:
# Yes
if not seq:
pass
if seq:
pass
# No
if len(seq):
pass
if not len(seq):
pass
字符串後面不要有大量拖尾空格。
不要用 == 進行布爾比較
# Yes
if greeting::
pass
# No
if greeting == True
pass
if greeting is True: # Worse
pass
python-PEP8編碼規範