python常見的PEP8規范


1. 括號中使用垂直隱式縮進或使用懸掛縮進
縮進
每級縮進用4個空格
  • 示例:

(垂直隱式縮進)對准左括號
def function_name(var_one,var_two,
var_three,var_four,)
不對准左括號,但是要比下面的代碼內容多一層縮進以便和后面的內容區別開來
def function_name(var_one,var_two,
var_three,var_four,)
print('hello,world')
--------------------------------------------------------------------------------
懸掛縮進必須多加一層縮進
def function_name(
var_one,var_two,
var_three,var_four,)
--------------------------------------------------------------------------------
# 左括號回退
my_list = [
1,2,3,4,5,
6,7,8,9,10
]
result = function_name (
'a','b','c',
'd','e','f'
)

復制代碼
(垂直隱式縮進)對准左括號
def function_name(var_one,var_two,
                  var_three,var_four,)
不對准左括號,但是要比下面的代碼內容多一層縮進以便和后面的內容區別開來
def function_name(var_one,var_two,
        var_three,var_four,)
    print('hello,world')
--------------------------------------------------------------------------------
懸掛縮進必須多加一層縮進
def function_name(
    var_one,var_two,
    var_three,var_four,)
--------------------------------------------------------------------------------
# 左括號回退
my_list = [
    1,2,3,4,5,
    6,7,8,9,10
]
result = function_name (
    'a','b','c',
    'd','e','f'
)
復制代碼
 2. 空格還是tab ?
  • 空格是首選的縮進方法
  • Tab僅僅在已經使用tab縮進的代碼中為了保持一致性而使用。
  • Python 3中不允許混合使用Tab和空格縮進。
  • Python 2的包含空格與Tab和空格縮進的應該全部轉為空格縮進
  • Python2命令行解釋器使用-t選項時有非法混合Tab和空格的情況會告警。當使用-tt警告提升為錯誤。強烈推薦這些選項!另外個人推薦pep8和autopep8模塊。
3. 最大行寬
  • 限制所有行的最大行寬為79字符。
  • 文本長塊,比如文檔字符串或注釋,行長度應限制為72個字符。

# 續行的首選方法是使用小括號、中括號和大括號反斜線仍可能在適當的時候。其次是反斜杠。比如with語句中:
with open('/path/to/some/file/you/want/to/read') as file_1, \
open('/path/to/some/file/being/written', 'w') as file_2:
file_2.write(file_1.read())
--------------------------------------------------------------------------------
# 注意續行要盡量不影響可讀性。比如通常在二元運算符之后續行:
class Rectangle(Blob):

def __init__(self, width, height,
color='black', emphasis=None, highlight=0):
if (width == 0 and height == 0 and
color == 'red' and emphasis == 'strong' or
highlight > 100):
raise ValueError("sorry, you lose")
if width == 0 and height == 0 and (color == 'red' or
emphasis is None):
raise ValueError("I don't think so -- values are %s, %s" %
(width, height))
Blob.__init__(self, width, height,
color, emphasis, highlight)

復制代碼
# 續行的首選方法是使用小括號、中括號和大括號反斜線仍可能在適當的時候。其次是反斜杠。比如with語句中:
with open('/path/to/some/file/you/want/to/read') as file_1, \
    open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())
--------------------------------------------------------------------------------
# 注意續行要盡量不影響可讀性。比如通常在二元運算符之后續行:
class Rectangle(Blob):

    def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
        if (width == 0 and height == 0 and
                color == 'red' and emphasis == 'strong' or
                highlight > 100):
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)
復制代碼
4. 空行
  • 兩行空行分割頂層函數和類的定義。
  • 類的方法定義用單個空行分割。
  • 額外的空行可以必要的時候用於分割不同的函數組,但是要盡量節約使用。
  • 額外的空行可以必要的時候在函數中用於分割不同的邏輯塊,但是要盡量節約使用。
  • Python接 contol-L作為空白符;許多工具視它為分頁符,這些要因編輯器而異。
5. 源文件編碼
  • 在核心Python發布的代碼應該總是使用UTF-8(ASCII在Python 2)。
  • ASCII文件(Python 2)或UTF-8(Python 3)不應有編碼聲明。
  • 標准庫中非默認的編碼應僅用於測試或當注釋或文檔字符串,比如包含非ASCII字符的作者姓名,盡量使用\x , \u , \U , or \N。
  • Python 3.0及以后版本,PEP 3131可供參考,部分內容如下:在Python標准庫必須使用ASCII標識符,並盡量只使用英文字母。此外字符串和注釋也必須用ASCII。唯一的例外是:(a)測試非ASCII的功能,和(b)作者的名字不是拉丁字母。
6. 導入
  • 導入在單獨行
# 正確方式
import os
import sys
from subprocess import Popen, PIPE
# 錯誤方式
import os,sys
# 正確方式
import os
import sys
from subprocess import Popen, PIPE
# 錯誤方式
import os,sys
  • 導入始終在文件的頂部,在模塊注釋和文檔字符串之后,在模塊全局變量和常量之前

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

    相關的all放在導入之后。

  • 推薦絕對路徑導入,因為它們通常更可讀,而且往往是表現更好的(或至少提供更好的錯誤消息)。

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

# 在絕對路徑比較長的情況下,也可以使用相對路徑:
from . import sibling
from .sibling import example
Python 3中已經禁止隱式的相對導入.

復制代碼
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

# 在絕對路徑比較長的情況下,也可以使用相對路徑:
from . import sibling
from .sibling import example
Python 3中已經禁止隱式的相對導入.
復制代碼
  •  導入類的方法:
from myclass import MyClass
from foo.bar.yourclass import YourClass

# 如果和本地名字有沖突:
import myclass
import foo.bar.yourclass
from myclass import MyClass
from foo.bar.yourclass import YourClass

# 如果和本地名字有沖突:
import myclass
import foo.bar.yourclass
  • 禁止使用通配符導入。

  通配符導入(from <module> import *)應該避免,因為它不清楚命名空間有哪些名稱存,混淆讀者和許多自動化的工具。唯一的例外是重新發布對外的API時可以考慮使用。

7. 字符串的引用
  • Python中單引號字符串和雙引號字符串都是相同的。注意盡量避免在字符串中的反斜杠以提高可讀性。
  • 根據PEP 257, 三個引號都使用雙引號。
8. 表達式和語句的空格
  • 括號里邊避免空格
# 括號里邊避免空格
# 正確寫法
spam(ham[1], {eggs: 2})
# 錯誤寫法
spam( ham[ 1 ], { eggs: 2 } )
# 括號里邊避免空格
# 正確寫法
spam(ham[1], {eggs: 2})
# 錯誤寫法
spam( ham[ 1 ], { eggs: 2 } )
  • 逗號,冒號,分號之前避免空格
# 逗號,冒號,分號之前避免空格
# 正確寫法
if x == 4: print x, y; x, y = y, x
# 錯誤寫法
if x == 4 : print x , y ; x , y = y , x
# 逗號,冒號,分號之前避免空格
# 正確寫法
if x == 4: print x, y; x, y = y, x
# 錯誤寫法
if x == 4 : print x , y ; x , y = y , x
  • 索引操作中的冒號當作操作符處理前后要有同樣的空格(一個空格或者沒有空格,個人建議是沒有)

# 正確寫法
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]
# 錯誤寫法
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : upper]
ham[ : upper]

復制代碼
# 正確寫法
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]
# 錯誤寫法
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : upper]
ham[ : upper]
復制代碼

 

8. 注釋
  • 與代碼自相矛盾的注釋比沒注釋更差。修改代碼時要優先更新注釋!
  • 注釋是完整的句子。如果注釋是斷句,首字母應該大寫,除非它是小寫字母開頭的標識符(永遠不要修改標識符的大小寫)。
  • 如果注釋很短,可以省略末尾的句號。注釋塊通常由一個或多個段落組成。段落由完整的句子構成且每個句子應該以點號(后面要有兩個空格)結束,並注意斷詞和空格。
  • 非英語國家的程序員請用英語書寫你的注釋,除非你120%確信代碼永遠不會被不懂你的語言的人閱讀。
  • 注釋塊通常應用在代碼前,並和這些代碼有同樣的縮進。每行以 '# '(除非它是注釋內的縮進文本,注意#后面有空格)。注釋塊內的段落用僅包含單個 '#' 的行分割。
  • 慎用行內注釋(Inline Comments) 節儉使用行內注釋。 行內注釋是和語句在同一行,至少用兩個空格和語句分開。行內注釋不是必需的,重復羅嗦會使人分心。不要這樣做:
# 正確寫法
x = x + 1 # Compensate for border
# 錯誤寫法
x = x + 1 # Increment x
# 正確寫法
x = x + 1 # Compensate for border
# 錯誤寫法
x = x + 1 # Increment x
9. 文檔字符串
  • docstring是一個字符串文字,作為模塊,函數,類或方法定義中的第一個語句出現。這樣的docstring成為該對象的__doc__特殊屬性
  • 所有模塊通常應該有文檔,所有由模塊導出的函數和類也應該有文檔。公共方法(包括__init__構造函數)也應該有docstrings。軟件包可能記錄在軟件包目錄中的__init__.py文件的模塊文檔字符串中
  • Python代碼中其他地方出現的字符串文字也可以作為文檔。它們不被Python字節碼編譯器識別,並且不能作為運行時對象屬性(即未分配給__doc__)訪問,但可以通過軟件工具提取兩種類型的額外文檔字符串:
  1. 在模塊,類或__init__方法的頂級簡單賦值之后立即出現的字符串文字被稱為“屬性文檔字符串”
  2. 在另一個文檔字符串之后立即出現的字符串文字稱為“其他文檔字符串”
10. 版本標簽

版本注記 (Version Bookkeeping)

  • 如果你必須在源文件中包含git、Subversion、CVS或RCS crud信息,放置在模塊的文檔字符串之后,任何其他代碼之前,上下各用一個空行:

    __version__ = "$Revision$"# $Source$

11. 命名約定
  • b(單個小寫字母)
  • B(單個大寫字母)
  • lowercase(小寫串)
  • lower_case_with_underscores(帶下划線的小寫)
  • UPPERCASE(大寫串)
  • UPPER_CASE_WITH_UNDERSCORES(帶下划線的大寫串)
  • CapitalizedWords(首字母大寫的單詞串或駝峰縮寫)
  注意: 使用大寫縮寫時,縮寫使用大寫字母更好。故 HTTPServerError 比  HttpServerError 更好
  • mixedCase(混合大小寫,第一個單詞是小寫)
  • Capitalized_Words_With_Underscores(帶下划線,首字母大寫,丑陋)

常見PEP8規范詳解


免責聲明!

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



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