行的最大长度 周围仍然有许多设备被限制在每行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: