編碼風格和PEP8規范


編碼風格

錯誤認知

  • 這很浪費時間
  • 我是個藝術家
  • 所有人都能穿的鞋不會合任何人的腳
  • 我善長制定編碼規范

正確認知

  • 促進團隊合作
  • 減少bug處理
  • 提高可讀性,降低維護成本
  • 有助於代碼審查
  • 養成習慣,有助於程序員自身的成長

pep8 編碼規范

Python Enhancement Proposals :python改進方案

https://www.python.org/dev/peps/

 

pep8 官網規范地址

https://www.python.org/dev/peps/pep-0008/

 

Guido的關鍵點之一是:代碼更多是用來讀而不是寫。編碼規范旨在改善Python代碼的可讀性。

風格指南強調一致性。項目、模塊或函數保持一致都很重要。

每級縮進用4個空格。

括號中使用垂直隱式縮進或使用懸掛縮進。后者應該注意第一行要沒有參數,后續行要有縮進。

  • Yes
    # 對准左括號
    foo = long_function_name(var_one, var_two,
                             var_three, var_four)
    
    # 不對准左括號,但加多一層縮進,以和后面內容區別。
    def long_function_name( var_one, var_two, var_three, var_four): print(var_one)
    • No
    層縮進.
    foo = long_function_name(
        var_one, var_two,
        var_three, var_four)
  • No
# 不使用垂直對齊時,第一行不能有參數。
foo = long_function_name(var_one, var_two,
    var_three, var_four)

# 參數的縮進和后續內容縮進不能區別。
def long_function_name( var_one, var_two, var_three, var_four): print(var_one)

4個空格的規則是對續行可選的。

# 懸掛縮進不一定是4個空格
foo = long_function_name(
  var_one, var_two,
  var_three, var_four)
if語句跨行時,兩個字符關鍵字(比如if)加上一個空格,再加上左括號構成了很好的縮進。后續行暫時沒有規定,至少有如下三種格式,建議使用第3種。

# 沒有額外縮進,不是很好看,個人不推薦.
if (this_is_one_thing and that_is_another_thing): do_something() # 添加注釋 if (this_is_one_thing and that_is_another_thing): # Since both conditions are true, we can frobnicate.  do_something() # 額外添加縮進,推薦。 # Add some extra indentation on the conditional continuation line. if (this_is_one_thing and that_is_another_thing): do_something()

右邊括號也可以另起一行。有兩種格式,建議第2種。

# 右括號不回退,個人不推薦
my_list = [
    1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', ) # 右括號回退 my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', )

空格或Tab?

  • 空格是首選的縮進方法。
  • Tab僅僅在已經使用tab縮進的代碼中為了保持一致性而使用。
  • Python 3中不允許混合使用Tab和空格縮進。
  • Python 2的包含空格與Tab和空格縮進的應該全部轉為空格縮進。

最大行寬

  • 限制所有行的最大行寬為79字符。
  • 文本長塊,比如文檔字符串或注釋,行長度應限制為72個字符。

空行

  • 兩行空行分割頂層函數和類的定義。
  • 類的方法定義用單個空行分割。
  • 額外的空行可以必要的時候用於分割不同的函數組,但是要盡量節約使用。
  • 額外的空行可以必要的時候在函數中用於分割不同的邏輯塊,但是要盡量節約使用。

源文件編碼

  • 在核心Python發布的代碼應該總是使用UTF-8(ASCII在Python 2)。
  • Python 3(默認UTF-8)不應有編碼聲明。

導入在單獨行

 

  • Yes:
import os
import sys from subprocess import Popen, PIPE
  • No:
import sys, os

 

 

  • 導入始終在文件的頂部,在模塊注釋和文檔字符串之后,在模塊全局變量和常量之前。

  • 導入順序如下:標准庫進口,相關的第三方庫,本地庫。各組的導入之間要有空行。

禁止使用通配符導入。

通配符導入(from import *)應該避免,因為它不清楚命名空間有哪些名稱存,混淆讀者和許多自動化的工具。

字符串引用

  • Python中單引號字符串和雙引號字符串都是相同的。注意盡量避免在字符串中的反斜杠以提高可讀性。
  • 根據PEP 257, 三個引號都使用雙引號。

括號里邊避免空格

# 括號里邊避免空格
# Yes
spam(ham[1], {eggs: 2})
# No
spam( ham[ 1 ], { eggs: 2 } )

逗號,冒號,分號之前避免空格

# 逗號,冒號,分號之前避免空格
# Yes
if x == 4: print x, y; x, y = y, x
# No
if x == 4 : print x , y ; x , y = y , x

索引操作中的冒號當作操作符處理前后要有同樣的空格(一個空格或者沒有空格,個人建議是沒有。)

# Yes
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] # No ham[lower + offset:upper + offset] ham[1: 9], ham[1 :9], ham[1:9 :3] ham[lower : : upper] ham[ : upper]

函數調用的左括號之前不能有空格

# Yes
spam(1)
dct['key'] = lst[index] # No spam (1) dct ['key'] = lst [index]

賦值等操作符前后不能因為對齊而添加多個空格

# Yes
x = 1
y = 2 long_variable = 3 # No x = 1 y = 2 long_variable = 3

二元運算符兩邊放置一個空格

涉及 =、符合操作符 ( += , -=等)、比較( == , < , > , != , <> , <= , >= , in , not in , is , is not )、布爾( and , or , not )。

優先級高的運算符或操作符的前后不建議有空格。

# Yes
i = i + 1
submitted += 1 x = x*2 - 1 hypot2 = x*x + y*y c = (a+b) * (a-b) # No i=i+1 submitted +=1 x = x * 2 - 1 hypot2 = x * x + y * y c = (a + b) * (a - b)

關鍵字參數和默認值參數的前后不要加空格

 Yes
def complex(real, imag=0.0): return magic(r=real, i=imag) # No def complex(real, imag = 0.0): return magic(r = real, i = imag)

通常不推薦復合語句(Compound statements: 多條語句寫在同一行)。

# Yes
if foo == 'blah':
    do_blah_thing()
do_one()
do_two()
do_three()

# No
if foo == 'blah': do_blah_thing() do_one(); do_two(); do_three()

盡管有時可以在if/for/while 的同一行跟一小段代碼,但絕不要跟多個子句,並盡量避免換行。

# No
if foo == 'blah': do_blah_thing()
for x in lst: total += x while t < 10: t = delay() 更不是: # No 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()

避免采用的名字

決不要用字符'l'(小寫字母el),'O'(大寫字母oh),或 'I'(大寫字母eye) 作為單個字符的變量名。一些字體中,這些字符不能與數字1和0區別。用'L' 代替'l'時。

包和模塊名

模塊名要簡短,全部用小寫字母,可使用下划線以提高可讀性。包名和模塊名類似,但不推薦使用下划線。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM