代碼編排
- 縮進(jìn)。4個空格的縮進(jìn)(編輯器都可以完成此功能),不使用Tab,更不能混合使用Tab和空格。
- 每行最大長度79,換行可以使用反斜杠,最好使用圓括號,換行點(diǎn)要在操作符的后面敲回車
- 類和top-level函數(shù)定義之間空兩行,類中的方法定義之間空一行,函數(shù)內(nèi)邏輯無關(guān)段落之間空一行,其他地方盡量不要空行
文檔編排
- 模塊內(nèi)容的順序,模塊說明和docstring--import --globals$constanst--其他定義,其中import部分,又按標(biāo)準(zhǔn)、三方和自己辨析順序依次排放,之間空一行。
- 不要再一句話import中引入多個庫,比如import os, sys不推薦
- 如果采用from XX import XX引用庫,可以省略model. ,都是可能出現(xiàn)命名沖突,這時就要采用import XX。
空格的使用
總體原則,避免不必要的空格
- 各種又括號前面不要加空格
-逗號、冒號、分號前不要加空格 - 函數(shù)的左括號前不要加空格
- 序列的左括號前不要加空格
- 操作符左右各加一個空格,不要為了對其增加空格
- 函數(shù)默認(rèn)參數(shù)使用的賦值符左右省略空格
-不要將多句語句寫在同一行,盡管使用“;”允許。 - if/for/while語句中,機(jī)試執(zhí)行語句只有一句,也必須另起一行
注釋
總體原則,錯誤的注釋不如沒有注釋,所以當(dāng)一段代碼發(fā)生變化時,第一件事就是要修改注釋!注釋必須使用英文,最好是完整的句子,首字母大寫,局后腰有結(jié)束符,結(jié)束符后面跟兩個空格,開始下一句,如果是短語,可以省略結(jié)束符
- 塊注釋,在一段代碼前增加注釋,在“#”后加一空格,段落之間以只有“#”的行間隔,比如:
# Description : Module config.
#
#input : None
#
# Output : None
- 行注釋,再一句代碼后加注釋,比如:
但是這種方式盡量少用
x = x + 1 # Increment x
- 避免無謂的注釋
文檔描述
- 為所有的共有模塊、函數(shù)、類、方法寫docstrings(函數(shù)或者模塊的幫助文檔);非共有的沒有必要,但是可以寫注釋(在def的下一行)
- 如果docstring要換行,參考如下例子:
""" Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
命名規(guī)范
總體原則,新編代碼必須按照下面命名風(fēng)格進(jìn)行,現(xiàn)有庫的編碼盡量保持風(fēng)格
- 盡量單獨(dú)使用小寫字母‘l’,大寫字母‘O’等容易混淆的字母
- 模塊名盡量短小,使用全部小寫的方式,可以使用下劃線
- 包命名盡量短小,使用全部小寫方式,不可以使用下劃線
- 類的命名使用CapWords的方式,模塊內(nèi)部使用的類采用_CapWords的方式
- 異常命名使用CapWords+Error后綴的方式
-全局變量盡量只在模塊內(nèi)有效,類似C語言中的static,實(shí)現(xiàn)方法有兩種,一是all機(jī)制,二是前綴一個下劃線 - 函數(shù)命名使用全部小寫的方式,可以使用下劃線
常量命名使用全部大寫的方式,可以試用下劃線 - 類的屬性(方法和變量)命名使用全部小寫方式,可以使用下劃線
- 類的屬性有三種作用域:public、non-public、subclass API,可以理解成c++中的public、private、protected、non-public屬性前,前綴一條下劃線
- 類的屬性若以關(guān)鍵字名字沖突,后綴一下劃線,盡量不要使用縮略等其他方式
- 為避免與子類屬性命名沖突,在類的一些屬性前,前綴兩條下劃線,比如: 類Foo中聲明__a,訪問時,只能通過Foo._Foo__a,避免歧義,如果子類也叫Foo,那就無能為力了
- 類的方法第一個參數(shù)必須是self,而靜態(tài)方法第一個參數(shù)必須是cls
編碼建議
- 編碼中考慮到其他python實(shí)現(xiàn)的效率問題,比如運(yùn)算“+”在CPython(Python)中效率很高,都是jython中卻非常低,多以應(yīng)該采用.join()的方式
- 盡可能使用“is”、“is not”取代“==”,比如 if x is not None 要優(yōu)于if x
- 使用基于類的異常,每個模塊或包都有自己的異常類,此異常類繼承自Exception
異常中不要使用裸露的except,except后跟具體的exceptions - 異常中try的代碼盡可能少,比如:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
要優(yōu)于
try:
# Too broad!
return handle_value(collection[key])
except KeyError:
# Will also catch KeyError raised by handle_value()
return key_not_found(key)
使用startswith() and endswith()代替切片進(jìn)行序列前綴或后綴的檢查。比如:
Yes: if foo.startswith('bar'):優(yōu)于
No: if foo[:3] == 'bar':
使用isinstance()比較對象的類型。比如
Yes: if isinstance(obj, int): 優(yōu)于
No: if type(obj) is type(1):
判斷序列空或不空,有如下規(guī)則
Yes: if not seq:
if seq:
優(yōu)于
No: if len(seq)
if not len(seq)