行的最大長度
周圍仍然有許多裝置被限制在每行80字元:而且,視窗限制在80個字元。使將多個視窗並排放置成為可能。在這些裝置上使用預設的摺疊方式看起來有點醜陋。因此,請將所有行限制在最大79字元(Emacs準確得將行限制為長80字元),對順序排放的大塊文本(文檔字串或注釋),推薦將長度限制在72字元。
摺疊長行的首選方法是使用Pyhon支援的圓括弧,方括弧和花括弧內的行延續。如果需要,你可以在運算式周圍增加一對額外的圓括弧,但是有時使用反斜線看起來更好,確認恰當得縮排了延續的行。
Emacs的Python-mode正確得完成了這些。一些例子:
#!Python
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"
Blob.__init__(self,width,height,color,emphasis,highlight)
行內注釋
一個行內注釋是和語句在同一行的注釋,行內注釋應該謹慎適用,行內注釋應該至少用兩個空格和語句分開,它們應該以'#'和單個空格開始。
x = x+1 # Increment x
如果語意是很明了的,那麼行內注釋是不必要的,事實上是應該被移除的。不要這樣寫:
x = x+1 # Increment x
x = x+1 # Compensate for border
但是有時,這樣是有益的:
x = x+1 # Compensate for border
文檔字串
應該一直遵守編寫好的文檔字串的約定PEP 257 [3]。為所有公用模組,函數,類和方法編寫文檔字串。文檔字串對非公開的方法不是必要的,但你應該有一個描述這個方法做什麼的注釋。這個注釋應該在"def"這行後。
PEP 257 描述了好的文檔字串的約定。一定注意,多行文檔字串結尾的"""應該單獨成行,例如:
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first。
"""
對單行的文檔字串,結尾的"""在同一行也可以。
版本註記
如果你要將RCS或CVS的雜項(crud)包含在你的源檔案中,按如下做。
#!Python
__version__ = "$Revision: 1。4 $"
# $Source: E:/cvsroot/Python_doc/pep8。txt,v $
這個行應該包含在模組的文檔字串之後,所有代碼之前,上下用一個空行分割。
設計建議
單個元素(singletons)的比較,如None 應該永遠用:‘is'或‘is not'來做。當你本意是“if x is not None”時,對寫成“if x”要小心。例如當你測試一個預設為None的變數或參數是否被設定為其它值時,這個值也許在布爾上下文(Boolean context)中是false!
基於類的異常總是好過基於字串的異常。模組和包應該定義它們自己的域內特定的基異常類,基類應該是內建的Exception類的子類。還始終包含一個類的文檔字串。例如:
#!Python
class MessageError(Exception):
"""Base class for errors in the email package。"""
使用字串方法(methods)代替字串模組,除非必須向後相容Python 2.0以前的版本。字串方法總是非常快,而且和unicode字串共用同樣的API(應用程式介面)在檢查首碼或尾碼時避免對字串進行切片。用startswith()和endswith()代替,因為它們是明確的並且錯誤更少。例如:
No: if foo[:3] == 'bar':
Yes: if foo。startswith('bar'):
例外是如果你的代碼必須工作在Python 1.5.2 (但是我們希望它不會發生!),物件類型的比較應該始終用isinstance()代替直接比較類型,例如:
No: if type(obj) is type(1):
Yes: if isinstance(obj, int):
檢查一個對象是否是字串時,緊記它也可能是unicode字串!在Python 2.3,str和unicode有公用的基類,basestring,所以你可以這樣做:
if isinstance(obj, basestring):
在Python 2.2類型模組為此定義了StringTypes類型,例如:
#!Python
from types import StringTypes
if isinstance(obj, StringTypes):
在Python 2.0和2.1,你應該這樣做:
#!Python
from types import StringType, UnicodeType
if isinstance(obj, StringType) or \
isinstance(obj, UnicodeType) :
對序列,(字串,列表,元組),使用空列表是false這個事實,因此“if not seq”或“if seq”比“if len(seq)”或“if not len(seq)”好。書寫字串文字時不要依賴於有意義的後置空格。這種後置空格在視覺上是不可辨別的,並且有些編輯器(特別是近來,reindent.py)會將它們修整掉。不要用==來比較布爾型的值以確定是True或False(布爾型是Pythn 2.3中新增的)
No: if greeting == True:
Yes: if greeting: