Python 编码风格参考
2019獨角獸企業重金招聘Python工程師標準>>>
代碼除了用來運行外,更多的是用來讀。為了是代碼的可讀性更強,很多編程語言都有自己的編碼規范。規范的制定是為了保持代碼的一致性,以使代碼更美觀和易讀。代碼應該怎么樣排版和編寫并不是絕對的,所以一些地方會有爭議。有時風格指南并不適用,最重要的知道何時不一致。當你無法判斷該怎么做時,應該所參考下其他的例子。
本文僅是一個 Python 編碼風格的參考,并不是一個規定,規定必須要這么去做。本文的目的應該是起一個指導作用,指導開發者去寫更易讀的代碼。
一、代碼編排
主要是縮進與空行的排版:
- 1、使用 4 個空格進行縮進(編輯器都可以完成此功能),不推薦使用制表符,更不能混合使用制表符和空格。
- 2、每行不超過 80 個字符,換行可以使用反斜杠,最好使用括號(Python 會將圓括號, 中括號和花括號中的行隱式的連接起來)。
- 3、類和頂層函數定義之間空兩行;類中的方法定義之間空一行;函數內邏輯無關段落之間空一行;其他地方盡量不要再空行。
二、文檔編排
主要是整個源碼文件的布局:
- 1、模塊內容的順序:模塊說明,模塊文檔字符串,導入語句,全局變量或者常量,其他定義。
- 2、模塊導入部分順序:標準庫,第三方模塊,自定義模塊;各部分之間空一行。
- 3、不要在一個 import 語句中一次導入多個模塊,比如 import os, sys 不推薦。
- 4、導入模塊時應該使用合適的方式來避免命名沖突,例如在適當的時候才使用 from xx import xx,盡量避免使用 from xx imoprt *。
- 5、在自已編寫的模塊中,如果需要使用 from xx import * 時,應該在導入語句后或者模塊尾使用 __all__ 機制來限制導入規則。
三、語句編排
- 1、通常每個語句應該獨占一行。
- 2、不要在行尾加分號, 也不要用分號將多條語句放在同一行。
- 3、if/for/while 語句中,即使執行語句只有一句,也應盡量另起一行。
- 4、不要在返回語句(return)或條件語句(if/for/while)中使用括號,除非是用于實現行連接。
- 5、對于 if 語句, 在沒有 else 且語句比較短時,可以在一行完成(但不推薦),比如:if foo: bar(foo).
- 6、對于簡單的類定義,也可以在一行完成(但不推薦),比如定義一個異常:class UnfoundError(Exception): pass.
- 7、函數和方法的括號中使用垂直隱式縮進或使用懸掛縮進。
四、空格使用
總體原則,避免不必要的空格。
- 1、各種右括號前不要加空格。
- 2、逗號、冒號、分號前不要加空格,但應該在它們后面加(除了在行尾)。
- 3、函數的左括號前不要加空格。如 Func(1)。
- 4、序列的左括號前不要加空格。如 list[2]。
- 5、操作符左右各加一個空格,不要為了對齊增加空格。
- 6、函數默認參數使用的賦值符左右省略空格。
良好的風格:
spam(ham[1], {eggs: 2})if x == 4:print x, y; x, y = y, xf = foo(1, 2, 3)ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:] ham[lower:upper], ham[lower:upper:], ham[lower::step] ham[lower+offset : upper+offset] ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)] ham[lower + offset : upper + offset]x = 1 y = 2 long_variable = 3def foo(a, b, c=0):return moo(m=a, n=b, o=c)不好的風格:
spam( ham[ 1 ], { eggs: 2 } )if x == 4 :print x , y ; x , y = y , xf = foo (1, 2, 3)ham[lower + offset:upper + offset] ham[1: 9], ham[1 :9], ham[1:9 :3] ham[lower : : upper] ham[ : upper]x = 1 y = 2 long_variable = 3def foo(a, b, c = 0):return moo(m = a, n = b, o = c)五、注釋
總體原則,錯誤的注釋不如沒有注釋。所以當一段代碼發生變化時,第一件事就是要修改注釋。注釋盡量使用英文,最好是完整的句子,首字母大寫,句后要有結束符,結束符后跟兩個空格,開始下一句。如果是短語,可以省略結束符。注釋應該在 # 后加一個空格才開始寫注釋內容。
- 1、塊注釋,在一段代碼前增加的注釋。段落之間用只有 ‘#’ 的行間隔。比如:
- 2、行注釋,在一句代碼后加注釋。應該盡量在語句后空兩格后再開始注釋。當有連續的行注釋時,為了美觀可以讓 ‘#’ 對齊。 在語句比較長時,應該盡量少使用行注釋。比如:
-
3、對類或者函數的說明,盡量不要在其定義的前一行或者后一行用塊注釋的形式來說明,而應該使用文檔字符串(docstring)
-
4、使用 TODO 注釋來標記待完成的工作,團隊協作中,必要的時候應該寫上你的名字或者聯系方式,比如:
- 5、避免無謂的注釋。你見過哪些奇趣的代碼注釋?
六、文檔描述
-
1、盡量為所有的共有模塊、函數、類、方法寫 docstring。
-
2、前三引號后不應該換行,應該緊接著在后面概括性的說明模塊、函數、類、方法的作用,然后再空一行進行詳細的說明。后三引號應該單獨占一行。比如:
- 3、如果要在 docstring 中對函數或者方法的參數以及返回值進行說明,可以參考如下形式:
七、命名規范
- 1、模塊命名盡量短小,使用全部小寫的方式,可以使用下劃線。
- 2、包命名盡量短小,使用全部小寫的方式,不可以使用下劃線。
- 3、類的命名使用駝峰命令的方式,即單詞首字符大寫,類名應該全部使用名詞。
- 4、異常命令應該使用加 Error 后綴的方式,比如:HTTPError。
- 5、全局變量盡量只在模塊內有效,并且應該盡量避免使用全局變量。
- 6、函數命名使用全部小寫的方式,使用下劃線分割單詞,并采用動賓結構。
- 7、常量命名使用全部大寫的方式,使用下劃線分割單詞。
- 8、類的屬性(方法和變量)命名使用全部小寫的方式,使用下劃線分割單詞。
- 9、變量、類屬性等命令盡量不要使用縮寫形式,除了計數器和迭代器,盡量不要使用單字符名稱。
- 10、類的方法第一個參數必須是 self,而靜態方法第一個參數必須是 cls。
- 11、在模塊中要表示私有變量或者函數時,可以在變量或者函數前加一個下劃線 _foo, _show_msg
- 12、在 Python 中沒有諸如 public、private、protected 等修飾符,而在類的定義中往往會有類似這樣的需求,那么可以在屬性或者方法前加一個下劃線表示 protected,加兩個下劃線來表示 private。加兩個下劃線的變量或者方法沒法直接訪問。比如:類 Foo 中聲明 __a, 則不能用 Foo.__a 的方式訪問,但可以用 Foo._Foo__a 的方式訪問。`
八、程序入口
Python 屬于腳本語言,代碼的運行是通過解釋器對代碼文件進行逐行解釋執行來完成的。它不像其他編程語言那樣有統一的入口程序,比如 Java 有 Main 方法,C/C++ 有 main 方法。Python 的代碼文件除了可以被直接執行外,還可以作為模塊被其他文件導入。所有的頂級代碼在模塊導入時都會被執行,當希望模塊被導入時,應該避免主程序被執行。這樣就需要把主程序放到 if __name__ == '__main__' 代碼塊中,比如:
def main():...if __name__ == '__main__':main()一個包除了能夠被導入外,也可以通過 python -m package 的方式被直接執行,前提是包中需要有 __main__.py,這個文件可以說是包的程序入口,包中有了這個文件就可以用 Python 的 -m 參數來直接運行。
九、編碼建議
-
1、盡可能使用 'is' 和 'is not' 取代 '==',比如 if x is not None 要優于 if x。
-
2、用 "is not" 代替 "not ... is",前者的可讀性更好。
-
3、使用基于類的異常,每個模塊或包都有自己的異常類,此異常類繼承自 Exception。
-
4、異常中盡量不要使用裸露的 except,except 后應該跟具體的 exceptions。
-
5、使用 startswith() 和 endswith() 代替切片進行序列前綴或后綴的檢查。
-
6、使用 isinstance() 比較對象的類型,而不是 type(),比如:
- 7、判斷序列是否為空時,不用使用 len() 函數,序列為空時其 bool 值為 False,比如:
-
8、字符串后面不要有大量拖尾空格。
-
9、使用 join 合并的字符串,字符串方法 join 可以合并 list、tuple、iterator 中的元素,效率比連接符 + 高。
-
10、使用 while 1 比 while True 更快。
-
11、使用 ** 比 pow 快 10 倍以上。
-
12、使用迭代器和生成器代替列表等數據結構效率更高,使用列表(字典)解析式和生成器表達式比用循環效率更高。
參考資料
- https://www.python.org/dev/peps/pep-0008/
- http://www.elias.cn/Python/PythonStyleGuide
- https://my.oschina.net/u/1433482/blog/464444
- http://nanshu.wang/post/2015-07-04/
- https://zhuanlan.zhihu.com/p/25696847
轉載于:https://my.oschina.net/kuanghy/blog/908522
總結
以上是生活随笔為你收集整理的Python 编码风格参考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LayaBox IDE 安装后执行项目报
- 下一篇: 考试系统—— 刷新页面 考试剩余时间不重