1. 程式人生 > 實用技巧 >python程式設計規範

python程式設計規範

python程式設計規範

python程式設計規範縮排換行Imports 匯入模組級的“呆”名表示式和語句中的空格其他建議註釋命名約定公共和內部的介面程式設計建議

縮排

  • 每一級縮排使用4個空格

  • 續行應該與其包裹元素對齊,要麼使用括號內的隱式行連線來垂直對齊,要麼使用掛行縮排對齊

  • 用掛行縮排時,應該考慮到第一行不應該有引數,以及使用縮排以區分自己是續行

# 與左括號對齊
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)

# 掛行縮排應該再換一行
foo = long_function_name(
var_one, var_two,
var_three, var_four)

# 在條件判斷的語句新增額外的縮排
if (this_is_one_thing
and that_is_another_thing):
do_something()

空格是首選的縮排方式,直接禁止使用tab鍵

換行

# 推薦:運算子和運算元很容易進行匹配
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
  • 頂層函式和類的定義,前後用兩個空行隔開。

  • 類裡的方法定義用一個空行隔開。

  • 相關的功能組可以用額外的空行(謹慎使用)隔開。

Imports 匯入

  • 匯入總是位於檔案的頂部,在模組註釋和文件字串之後,在模組的全域性變數與常量之前。

    匯入應該按照以下順序分組:

    1. 標準庫匯入

    2. 相關第三方庫匯入

    3. 本地應用/庫特定匯入

    4. 你應該在每一組匯入之間加入空行。

  • 推薦使用絕對路徑匯入

  • 避免萬用字元的匯入(from import *)

模組級的“呆”名

“呆名“(名字裡有兩個字首下劃線和兩個字尾下劃線)必須出現在除文件字串之外的其他程式碼之前。

"""This is the example module.

This module does stuff.
"""

from __future__ import barry_as_FLUFL

__all__ = ['a', 'b', 'c']
__version__ = '0.1'
__author__ = 'Cardinal Biggles'

import os
import sys

表示式和語句中的空格

在下列情況下,避免使用無關的空格:

  • 緊跟在小括號,中括號或者大括號後

  • 緊貼在逗號、分號或者冒號之前

  • 緊貼在函式引數、索引、切片的左括號之前

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: spam(1)
No: spam (1)

Yes: dct['key'] = lst[index]
No: dct ['key'] = lst [index]

其他建議

  • 避免在尾部新增空格。

  • 總是在二元運算子兩邊加一個空格:賦值(=),增量賦值(+=,-=),比較(==,<,>,!=,<>,<=,>=,in,not,in,is,is not),布林(and, or, not)。

  • 如果使用具有不同優先順序的運算子,請考慮在具有最低優先順序的運算子周圍新增空格。有時需要通過自己來判斷;但是,不要使用一個以上的空格,並且在二元運算子的兩邊使用相同數量的空格。

  • 在制定關鍵字引數或者預設引數值的時候,不要在=附近加上空格。

  • 功能型註釋應該使用冒號的一般性規則,並且在使用->的時候要在兩邊加空格。

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

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

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

註釋

  • 若註釋很短,結尾的句號可以省略。塊註釋一般由完整句子的一個或多個段落組成,且每句話結束有個句號。

  • 在句尾結束的時候應該使用兩個空格。

  • 塊註釋通常適用於跟隨它們的某些(或全部)程式碼,並縮排到與程式碼相同的級別。

  • 有節制地使用行內註釋。行內註釋是與程式碼語句同行的註釋。行內註釋和程式碼至少要有兩個空格分隔。註釋由#和一個空格開始。

  • 多行文件說明使用的結尾三引號應該自成一行。

    """Return a foobang

    Optional plotz says to frobnicate the bizbaz first.
    """
  • 對於單行的文件說明,尾部的三引號應該和文件在同一行。

命名約定

  • 類名首字母大寫

  • 函式名應小寫,若想提高可讀性,可用下劃線分隔

  • 始終要將 self 作為例項方法的的第一個引數

  • 始終要將 cls 作為類靜態方法的第一個引數

  • 如果函式的引數名和已有的關鍵詞衝突,在最後加單一下劃線比縮寫或隨意拼寫更好。因此 class_ 比 clss 更好。(也許最好用同義詞來避免這種衝突)

  • 使用下劃線分隔小寫單詞以提高可讀性

  • 常量通常定義在模組級,通過下劃線分隔的全大寫字母命名。例如: MAX_OVERFLOW 和 TOTAL

公共和內部的介面

  • 模組應該使用__all__屬性顯式地在它們的公共API中宣告名稱。將__all__設定為空列表表示模組沒有公共API。

  • 即使通過__all__設定過,內部介面(包,模組,類,方法,屬性或其他名字)依然需要單個下劃線字首。

程式設計建議

  • 和像None這樣的單例物件進行比較的時候應該始終用 is 或者 is not,永遠不要用等號運算子

  • 始終使用def表示式,而不是通過賦值語句將lambda表示式繫結到一個變數上

    # √
    def f(x): return 2*x

    # ×
    f = lambda x: 2*x
  • 返回的語句保持一致。函式中的返回語句都應該返回一個表示式,或者都不返回。如果一個返回語句需要返回一個表示式,那麼在沒有值可以返回的情況下,需要用 return None 顯式指明,並且在函式的最後顯式指定一條返回語句(如果能跑到那的話)。

    # √
    def foo(x):
    if x >= 0:
    return math.sqrt(x)
    else:
    return None

    def bar(x):
    if x < 0:
    return None
    return math.sqrt(x)

    # ×
    def foo(x):
    if x >= 0:
    return math.sqrt(x)

    def bar(x):
    if x < 0:
    return
    return math.sqrt(x)
  • 使用字串方法代替字串模組

  • 使用 ”.startswith() 和 ”.endswith() 代替通過字串切割的方法去檢查字首和字尾

  • 物件型別的比較應該用isinstance()而不是直接比較type

    正確: if isinstance(obj, int):

    糟糕: if type(obj) is type(1):
  • 不要用 == 去和True或者False比較

    正確: if greeting:
    糟糕: if greeting == True:
    更糟: if greeting is True: