Python核心發行代碼里面優先使用ASCII碼或Latin-1編碼。3.0后UTF-8編碼優先於Latin-1。
一 空格與縮進:
縮進
對於每一次縮進使用4個空格。使用括號、中括號、大括號進行垂直對齊,或者縮進對齊。
制表符還是空格?
永遠不要將制表符與空格混合使用。Python最常用的縮進方式是只是用空格。
當調用Python命令行的 -t 選項時,它會檢測並警告代碼非法混合使用制表符和空格。當使用 -tt 選項時,警告變成了錯誤。
二. 主要命名規范
模塊名采用小寫字母並且以下划線分隔單詞的形式;
包名應當簡短,使用全小寫,但是不要使用下划線
類名采用以大寫字母開頭,並且以大寫字母分隔單詞的形式命名(駝峰式命名);
全局或者類常量,全部使用大寫字母,並且以下划線分隔單詞;其余變量命名則是采用全部小寫字母,並且以下划線分隔單詞的形式命名。
以上的內容如果是內部的,則使用下划線開頭命名。
類型
公共(全局)
內部
模塊名
lower_with_under
_ lower_with_under
包名
lowerwithoutunder
類名
CapWords
_ CapWords
異常名
CapWords
函數名
lower_with_under( )
_ lower_with_under( )
全局/類常量
CAPS_WITH_UNDER
_ CAPS_WITH_UNDER
全局/類變量
lower_with_under
_ lower_with_under
實例變量
lower_with_under
_ lower_with_under(單下划線私有)
__lower_with_under(雙下划線避免與子類沖突)
方法名
lower_with_under( )
_ lower_with_under()(單下划線私有)
__lower_with_under()(雙下划線避免與子類命名沖突)
函數/方法參數
lower_with_under
本地變量
lower_with_under
注:
1、from M import * 不會導入以下划線開始的對象。
2、異常也是一個類,所以需要遵循類名規則。但如果你的異常確實是個錯誤的話,請使用Error前綴
3、函數與方法參數設置時,使用self作為實例方法的第一個參數。使用cls作為類方法的第一個參數。當函數的參數名與保留字沖突時,使用下划線后綴(第二次提醒)。
4、方法名與實例變量設置時,在私有方法和實例變量前用單下划線前綴。使用雙下划線前綴來調用"name mangling"來避免與子類命名沖突。如果類Foo有個屬性叫__a,那么它不能使用Foo.__a讀取,但仍然可以Foo._Foo__a來讀取
5、應避免使用的命名:不要使用小寫的L、大寫的O、以及大寫的I作為單字符變量名。__double_leading_and_trailing_underscore__:(雙下划線開始和結束)存活在用戶控制命名空間的"magic"對象或屬性。例如__init__, __import__ 或 __file__。永遠不要起這樣的名字。
三.行規范
1、最大行長度
限制所有行最長為79個字符。
使用反斜杠來分行是一個很好的選擇。
我們應當選擇在二元操作符(binary operator,如下述代碼中的and、or以及%)之后進行分行,而不是之前。
2、空行
頂級函數(當前文件中的第一個函數)或者頂級類(當前文件的第一個類)之前要有兩個空行
定義在類內部的函數(成員函數)之間要留有一個空行
可以使用額外的空行(但要注意節制)以區分不同的函數組,
在一堆只有一行的函數之間不要使用空行(比如一些函數的空實現)
在函數內部使用空行,來標識不同的邏輯單元
四.注釋
誤導的注釋不如沒有注釋,注釋應當為完整的句子,且句號結尾的句子后面應當有2個空格。如果注釋很短那么結尾的句號可以忽略。
1、塊注釋
塊注釋應當和代碼縮進保持一致。每行注釋開頭應以#開頭,然后緊跟一個空格。
2、行注釋
行注釋至少和語句間隔2個空格。同樣的注釋應當以#開頭,然后緊跟一個空格。
五.文檔字符串
在python中,不對單引號和雙引號作區分,PEP的代碼規范也不對此有所推薦。任選其一,統一使用即可。然而,當一個字符串包含單引號或者雙引號時,使用另外一種方式避免轉義符(\)的使用,以提高可讀性。
對於所有的公有模塊、類、函數和方法都需要編寫文檔字符串。
""" 作為多行的文檔字符串的結束,應該單獨一行,並且之前有一個空行。
對於只有一行的文檔字符串來說,結尾的 """ 在同一行。
六.其他建議
1、總是在下列二元操作符的兩端使用單個空格:賦值操作符(=),參數賦值(+=,-= 等),比較操作符(==,<, >, !=, <>, ⇐, >=, in, not in, is, is not),布爾操作符(and,or, not)。
2、加入使用了多個具有不同優先級的操作符,考慮在低優先級的操作符兩側使用空格。請自行判斷,無論怎樣,不要使用多余一個空格,並且保持二元操作符兩端的空格數量一致。
#符合約定的代碼
i = i + 1
submitted +=1
x = x*2 - 1
hypot2 = x*x + y*y
c =(a+b) * (a-b)
#不符合約定的代碼
i=i+1
submitted +=1
x = x * 2 - 1
hypot2 = x * x + y * y
c =(a + b) * (a - b)
3、不要在指示關鍵字參數或參數默認值的 = 符號兩端使用空格。
#符合約定的代碼
defcomplex(real, imag=0.0):
return magic(r=real, i=imag)
#不符合約定的代碼
defcomplex(real, imag =0.0):
return magic(r = real, i = imag)
4、不建議使用符合語句(在一個物理行中存在多條語句)。
#符合建議的代碼
if foo =='blah':
do_blah_thing()
do_one()
do_two()
do_three()
#不符合建議的代碼
if foo =='blah':do_blah_thing()
do_one(); do_two(); do_three()
5、雖然有時把較短小的 if/for/while 語句放在同一物理行內也是可以的,但千萬不要對多子句的語句也這樣做,同時也是為了避免折疊長行。
#不符合約定的代碼
if foo =='blah':do_blah_thing()
for x in lst: total += x
while t <10: t = delay()
#絕對不要這樣寫
if foo =='blah':do_blah_thing()
else: do_non_blah_thing()
try: something()
finally: cleanup()
do_one(); do_two(); do_three(long, argument,
list, like, this)
if foo =='blah': one(); two(); three()