來源 | 異步圖書本節收錄了稍做剪輯的PEP 8摘要(Python Enhancement Proposal,Python加強提案)。PEP 8由Guido van Rossum和Barry Warsaw撰寫,是Python的最接近編程風格手冊的東西。這裏省略了一些比較具體的部分,但主要內容都已包括。應該儘量讓代碼遵照PEP 8規範,代碼會由此更具Python風格。
訪問Python官方網站的文檔部分並搜索PEP,就能夠得到PEP 8全文及Python歷史上發佈的全部其餘PEP。PEP既是Python歷史和經驗的絕佳來源,也是當前議題和未來計劃的解釋。css
!編程
01數組
簡介本文檔給出的Python編碼約定,適用於由Python主發行版本中的標準庫構成的代碼。有關Python的C實現中的C代碼風格指南,參見相應的PEP。本文檔改編自Guido最初的Python風格指南文章,並加入了Barry風格指南的一些內容。若是與Guido的風格規則存在衝突,應該聽從本PEP。本PEP可能還沒有完結(其實可能永遠不會完結)。 異步
02編輯器
Guido的一個重要觀點是,代碼被閱讀的次數遠多於被編寫的次數。本指南旨在提升代碼的可讀性,使各類各樣的Python代碼能保持風格一致。正如PEP 20所述,「Readability counts」(注重可讀性)。風格指南是討論一致性的。與風格指南保持一致很重要。維持同一個項目內部的一致性更加劇要。而保證同一個模塊和函數內部的一致性則最重要。然而最最重要的是,知道什麼時候應打破一致性,有時風格指南並不適用。若是心存疑慮,請採用本身的最佳判斷。請看看別人的例子並作出最佳決定。不要猶豫,儘管發出疑問。如下是兩個打破規範的好理由。函數
03工具
縮進佈局
每級縮進採用4個空格。爲了對付那些確實陳舊的代碼,又不肯作出清理,那麼能夠繼續沿用8個空格長度的製表符。網站
製表符仍是空格ui
絕對禁止製表符和空格的混用。最流行的Python縮進方式是隻使用空格。第二流行的方式是隻使用製表符。混合使用製表符和空格進行縮進的代碼,應該轉換爲只使用空格的方式。若是調用Python命令行解釋器時帶上-t
參數,它就會對非法混用製表符和空格的代碼發出警告。若是用了-tt
參數,這些警告就會上升爲錯誤。強烈推薦使用這些參數!對全新的項目而言,強烈建議只用空格縮進,換掉全部的製表符。大部分編輯器都具有將製表符替換爲空格的便捷功能。
最大行長
全部行都應限制在79個字符之內。將行長限制在80個字符的設備還有不少,並且將窗口限制爲80個字符寬就能夠並排放置多個窗口。這些設備上的默認換行會破壞代碼的外觀,增長理解的難度。所以,請將全部行都限制在79個字符之內。對於連續的大段文字(文檔字符串或註釋),建議將行長限制在72個字符之內。對長行進行換行的首選方案,是利用Python隱含的行鏈接特性,在圓括號、方括號和大括號內部進行斷行。必要時能夠在表達式外面多加一對圓括號,不過有時候用反斜槓會更好看些。請確保對後續行進行適當的縮進。打斷二元運算符的首選位置是在運算符以後,而不是運算符以前。下面給出一些例子:
1class Rectangle(Blob):
2 def __init__(self, width, height,
3 color='black', emphasis=None, highlight=0):
4 if (width == 0 and height == 0 and\
5 color == 'red' and emphasis == 'strong' or \
6 highlight > 100):
7 raise ValueError("sorry, you lose")
8 if width == 0 and height == 0 and (color == 'red' or
9 emphasis is None):
10 raise ValueError("I don't think so -- values are %s, %s" %
11 (width, height))
12 Blob.__init__(self, width, height,
13 color, emphasis, highlight)
空行
頂級函數和類定義之間,請用兩個空行分隔。類內部的各個方法定義之間,請用1個空行分隔。爲了讓有關聯的函數成組,能夠在各函數組之間有節制地添加空行。相互關聯的一組單行函數之間,能夠省略空行,如一組函數的僞實現(dummy implementation)。函數內部能夠有節制地用空行來區分出各個邏輯部分。Python可將Ctrl+L(^L)換頁符接受爲空白符。不少工具都將其視爲分頁符,因此能夠利用其進行分頁,使得文件中的關聯部分單獨成頁。
導入
導入語句一般應單獨成行,例如:
1import os
2import sys
不要像下面這樣寫在一塊兒:
1import sys, os
不過下面的寫法沒有問題:
1from subprocess import Popen, PIPE
導入語句一般位於文件的頂部,緊挨着模塊註釋和文檔字符串後面,在模塊全局變量和常量定義以前。
導入語句應按照如下順序進行分組。(1)標準庫的導入。(2)相關第三方庫的導入。(3)本地應用程序/庫——特定庫的導入。每組導入語句之間請加入1個空行。任何對應的__all__
聲明都應位於導入語句以後。很是不推薦對內部包的導入使用相對導入語法。請始終對全部導入都使用絕對包路徑。即使Python 2.5如今已徹底實現了PEP 328,它的顯式相對導入語法也是強烈不推薦的。絕對導入的可移植性更好,一般可讀性也會更好。若是是從包含類的模塊中導入類,一般能夠採用以下寫法:
1from myclass import MyClass
2from foo.bar.yourclass import YourClass
若是上述寫法會致使本地命名衝突,就採用以下寫法:
1import myclass
2import foo.bar.yourclass
而後用myclass.MyClass
和foo.bar.yourclass.YourClass
表示類。
表達式和語句內的空白符
討厭之事——如下場合應避免使用多餘的空白符。
正確:
1spam(ham[1], {eggs: 2})
錯誤:
1spam( ham[ 1 ], { eggs: 2 } )
正確:
1if x == 4: print x, y; x, y = y, x
錯誤:
1if x == 4 : print x , y ; x , y = y , x
正確:
1spam(1)
錯誤:
1spam (1)
正確:
1dict['key'] = list[index]
錯誤:
1dict ['key'] = list [index]
正確:
1x = 1
2y = 2
3long_variable = 3
錯誤:
1x = 1
2y = 2
3long_variable = 3
其餘建議
始終在如下二元操做符兩側各放1個空格:賦值(=
)、增量賦值(+=
,-=
等)、比較(==
、<
、>
、!=
、<>
、<=
、>=
、in
、not
、in
、is
、is not
)、布爾(and
、or
、not
)。
正確:
1i = i + 1
2submitted += 1
3
4x = x * 2 – 1
5hypot2 = x * x + y * y
6c = (a + b) * (a - b)
錯誤:
1i=i+1
2submitted +=1
3x = x*2 – 1
4hypot2 = x*x + y*y
5c = (a+b) * (a-b)
=
兩邊使用空格。正確:
1def complex(real, imag=0.0):
2 return magic(r=real, i=imag)
錯誤:
1def complex(real, imag = 0.0):
2 return magic(r = real, i = imag)
正確:
1if foo == 'blah':
2 do_blah_thing()
3do_one()
4do_two()
5do_three()
最好不要:
1if foo == 'blah': do_blah_thing()
2do_one(); do_two(); do_three()
if/for/while
放在同一行沒什麼問題,但多行語句絕對不能如此。同時還要避免過長代碼行的摺疊!最好不要:
1if foo == 'blah': do_blah_thing()
2for x in lst: total += x
3 while t < 10: t = delay()
絕對不要:
1if foo == 'blah': do_blah_thing()2else: do_non_blah_thing()3try: something()4finally: cleanup()5do_one(); do_two(); do_three(long, argument, 6 list, like, this)7if foo == 'blah': one(); two(); three()