Python編碼風格指南

來源 | 異步圖書本節收錄了稍做剪輯的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工具


   

代碼佈局

1. 

縮進佈局

每級縮進採用4個空格。爲了對付那些確實陳舊的代碼,又不肯作出清理,那麼能夠繼續沿用8個空格長度的製表符。網站

2. 

製表符仍是空格ui

絕對禁止製表符和空格的混用。最流行的Python縮進方式是隻使用空格。第二流行的方式是隻使用製表符。混合使用製表符和空格進行縮進的代碼,應該轉換爲只使用空格的方式。若是調用Python命令行解釋器時帶上-t參數,它就會對非法混用製表符和空格的代碼發出警告。若是用了-tt參數,這些警告就會上升爲錯誤。強烈推薦使用這些參數!對全新的項目而言,強烈建議只用空格縮進,換掉全部的製表符。大部分編輯器都具有將製表符替換爲空格的便捷功能。

3. 

最大行長

全部行都應限制在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)

4. 

空行

頂級函數和類定義之間,請用兩個空行分隔。類內部的各個方法定義之間,請用1個空行分隔。爲了讓有關聯的函數成組,能夠在各函數組之間有節制地添加空行。相互關聯的一組單行函數之間,能夠省略空行,如一組函數的僞實現(dummy implementation)。函數內部能夠有節制地用空行來區分出各個邏輯部分。Python可將Ctrl+L(^L)換頁符接受爲空白符。不少工具都將其視爲分頁符,因此能夠利用其進行分頁,使得文件中的關聯部分單獨成頁。

5. 

導入

導入語句一般應單獨成行,例如:

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.MyClassfoo.bar.yourclass.YourClass表示類。

6. 

表達式和語句內的空白符

討厭之事——如下場合應避免使用多餘的空白符。

  • 緊靠小括號、中括號或大括號內部。

正確:

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

7. 

其餘建議

始終在如下二元操做符兩側各放1個空格:賦值(=)、增量賦值(+=-=等)、比較(==<>!=<><=>=innotinisis not)、布爾(andornot)。

  • 在數學運算符兩側放置空格。

正確:

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()
相關文章
相關標籤/搜索