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 匯入
-
匯入總是位于檔案的頂部,在模塊注釋和檔案字串之后,在模塊的全域變數與常量之前,
匯入應該按照以下順序分組:
-
標準庫匯入
-
相關第三方庫匯入
-
本地應用/庫特定匯入
-
你應該在每一組匯入之間加入空行,
-
-
推薦使用絕對路徑匯入
-
避免通配符的匯入(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: -
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/86792.html
標籤:Python
上一篇:309最佳股票買賣時機含冷凍期
