标签:des style blog http io color os ar 使用
用Python进行开发时的编码风格约定
原文:PEP 008 《Style Guide for Python Code》
下载(中文pdf): PythonCodingRule.pdf
愚蠢得使用一致性是无知的妖怪(A Foolish Consistency is the Hobgoblin of Little Minds)
呆板的坚持一致性是傻的没边了! -- Zoomq
(Code lay-out)
(Indentation)
(Tabs or Spaces)
(Maximum Line Length)
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)
(Blank Lines)
(Encodings)(PEP 263)
Python 2.4 以后内核支持 Unicode 了! 不论什么情况使用 UTF-8 吧!这是王道!
(Imports)
No: import sys, os
Yes: import sys
import os
from types import StringType, ListType
from MyClass import MyClass
from foo.bar.YourClass import YourClass
import MyClass
import foo.bar.YourClass
即使用"MyClass.MyClass"和"foo.bar.YourClass.YourClass"
(Whitespace in Expressions and Statements)
"spam( ham[ 1 ], { eggs: 2 } )". Always write this as "spam(ham[1], {eggs: 2})".
紧挨着圆括号,方括号和花括号的,如:"spam( ham[ 1 ], { eggs: 2 } )". 要始终将它写成"spam(ham[1], {eggs: 2})".
"if x == 4 : print x , y ; x , y = y , x". Always write this as "if x == 4: print x, y; x, y = y, x".
"if x == 4 : print x , y ; x , y = y , x". 要始终将它写成 "if x == 4: print x, y; x, y = y, x".
紧贴着函数调用的参数列表前开式括号(open parenthesis )的,如"spam (1)".要始终将它写成"spam(1)".
slicing, as in: "dict [‘key‘] = list [index]". Always write this as "dict[‘key‘] = list[index]".
"dict [‘key‘] = list [index]".要始终将它写成"dict[‘key‘] = list[index]".
x = 1
y = 2
long_variable = 3
x = 1
y = 2
long_variable = 3
(Other Recommendations)
始终在这些二元运算符两边放置一个空格:赋值(=), 比较(==, <, >, !=, <>, <=,>=, in, not in, is, is not), 布尔运算 (and, or, not).
* 按你的看法在算术运算符周围插入空格. 始终保持二元运算符两边空格的一致.
i = i+1
submitted = submitted + 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
c = (a + b) * (a - b)
def complex(real, imag=0.0):
return magic(r=real, i=imag)
No: if foo == ‘blah‘: do_blah_thing()
Yes: if foo == ‘blah‘:
do_blah_thing()
No: do_one(); do_two(); do_three()
Yes: do_one()
do_two()
do_three()
(Comments)
我就是坚持全部使用中文来注释,真正要发布脚本工具时,再想E文的; 开发时每一瞬间都要用在思量中,坚决不用在E文语法,单词的回忆中!
-- ZoomQUiet
约定使用统一的文档化注释格式有利于良好习惯和团队建议!-- CodeCommentingRule
(Block Comments)
(Inline Comments)
x = x+1 # Increment x
x = x+1 # Increment x
x = x+1 # Compensate for border
x = x+1 # Compensate for border
(Documentation Strings)
PEP 257. 应该一直遵守编写好的文档字符串(又名"docstrings")的约定(?实在不知道怎么译)
Documentation Strings-- 文档化字符 ; 为配合 pydoc;epydoc,Doxygen等等文档化工具的使用,类似于MoinMoin 语法,约定一些字符, 以便自动提取转化为有意义的文档章节等等文章元素! -- Zoomq
PEP 257 描述了好的文档字符串的约定.一定注意,多行文档字符串结尾的""" 应该单独成行,例如:
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
实际上Python 自个儿就使用文档化编码维护着所有内置对象的使用说明\ 不信的话常试:
#python
>>> import time
>>> dir(time)
[‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘accept2dyear‘, ‘altzone‘, ‘asctime‘, ‘clock‘, ‘ctime‘, ‘daylight‘, ‘gmtime‘, ‘localtime‘, ‘mktime‘, ‘sleep‘, ‘strftime‘, ‘strptime‘, ‘struct_time‘, ‘time‘, ‘timezone‘, ‘tzname‘, ‘tzset‘]
>>> help(time.time)
Help on built-in function time in module time:
time(...)
time() -> floating point number
Return the current time in seconds since the Epoch.
Fractions of a second may be present if the system clock provides them.
(Version Bookkeeping) (我觉得叫"注记"更好)
__version__ = "$Revision: 1.4 $"
# $Source: E:/cvsroot/python_doc/pep8.txt,v $
对于CVS的服务器工作标记更应该在代码段中明确出它的使用 如:在文档的最开始的版权声明后应加入如下版本标记:
# 文件:$id$
# 版本: $Revision$
这样的标记在提交给配置管理服务器后,会自动适配成为相应的字符串,如:
# 文件:$Id: ussp.py,v 1.22 2004/07/21 04:47:41 hd Exp $
# 版本: $Revision: 1.4 $
----HD
(Naming Conventions)
(Descriptive: Naming Styles)
CapitalizedWords(首字母大写单词串) (或 CapWords, CamelCase -- 这样命名是由于它的字母错落有致的样子而来的.
这有时也被当作StudlyCaps. 如:GetName
mixedCase (混合大小写串)(与首字母大写串不同之处在于第一个字符是小写如:getName)
Capitalized_Words_With_Underscores(带下划线的首字母大写串) (丑陋!)
os.stat()函数返回一个tuple, 他的元素传统上有象st_mode, st_size, st_mtime等等这样的名字. X11库的所有公开函数以X开头.
(在Python中,这个风格通常认为是不必要的, 因为属性和方法名以对象作前缀,而函数名以模块名作前缀.)
"Tkinter.Toplevel(master, class_=‘ClassName‘)".
__double_leading_underscore(双下划线): 从Python 1.4起为类私有名.
__double_leading_and_trailing_underscore__: 特殊的(magic) 对象或属性,存在于用户控制的(user-controlled)名字空间, 例如:__init__, __import__ 或 __file__. 有时它们被用户定义, 用于触发某个特殊行为(magic behavior)(例如:运算符重载); 有时被构造器(infrastructure)插入,以便自己使用或为了调试. 因此,在未来的版本中,构造器(松散得定义为Python解释器和标准库) 可能打算建立自己的魔法属性列表,用户代码通常应该限制将这种约定作为己用. 欲成为构造器的一部分的用户代码可以在下滑线中结合使用短前缀,例如. __bobo_magic_attr__.
(Prescriptive: Naming Conventions)
(Names to Avoid)
O‘(大写字母oh),或I‘(大写字母eye)作为单字符的变量名. 在某些字体中,这些字符不能与数字1和0分开.当想要使用‘l‘时,用‘L‘代替它.
(Module Names)
(Class Names)
几乎没有例外,类名总是使用首字母大写单词串(CapWords)的约定.
(Exception Names)
趋势似乎是倾向使用CapWords异常名.
(Global Variable Names)
(Function Names)
mixedCase仅被允许用于这种风格已经占优势的上下文(如: threading.py) 以便保持向后兼容.
(Method Names and Instance Variables)
如果类Foo有一个属性名为 __a, 它不能以Foo.__a访问. (执著的用户(An insistent user)还是可以通过Foo._Foo__a得到访问权.) 通常,双前导下划线应该只用来避免与类(为可以子类化所设计)中的属性发生名字冲突.
(Designing for inheritance)
(Programming Recommendations)
同 象None之类的单值进行比较,应该永远用:‘is‘或‘is not‘来做. 当你本意是"if x is not None"时,对写成"if x"要小心 -- 例如当你测试一个默认为None的变量或参数是否被设置为其它值时. 这个其它值可能是一个在布尔上下文中为假的值!
基于类的异常总是好过基于字符串的异常. 模块和包应该定义它们自己的域内特定的基异常类(base exception class), 基类应该是内建的Exception类的子类. 还始终包含一个类的文档字符串.例如:
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类型, 例如:
from types import StringTypes
if isinstance(obj, StringTypes):
在Python 2.0和2.1,你应该这样做:
from types import StringType, UnicodeType
if isinstance(obj, StringType) or \
isinstance(obj, UnicodeType) :
对序列,(字符串(strings),列表(lists),元组(tuples)), 使用空列表是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:
No: if greeting == True:
Yes: if greeting:
标签:des style blog http io color os ar 使用
原文地址:http://www.cnblogs.com/Simon-xm/p/4058763.html