PCS7 Python编码规范
概述
本文参考自 Python 增进提案仓库 008 号文件的倡议。
原文“PEP 008 《Style Guide for Python Code》”:/dev/peps/pep-0008/ 精巧地址:bit.ly/2OQ8Z3
200字美文摘抄其中文翻译:/moin/PythonCodingRule
精巧地址:bit.ly/3HURoL
在这里先简要叙述一下要点。
应用
Python八荣八耻
以动手实践为荣,以只看不练为耻;
以打印日志为荣,以单步跟踪为耻;
以空格缩进为荣,以制表缩进为耻;
以单元测试为荣,以人工测试为耻;
以模块复用为荣,以复制粘贴为耻;
给老师的建议
以多态应用为荣,以分支判断为耻;
74 | 可爱的P y t h o n | P y t h o n 编码规范 | P C S 7
以Pythonic 为荣,以冗余拖沓为耻; 以总结分享为荣,以跪求其解为耻。
这首诗出自于CPyUG:40912:/group/python-cn/brow_thread/ thread/71c74c4e77577365/a4940f98b59bde43 精巧地址:bit.ly/4jeBor
它非常简明地指出了学习Python 的多个注意点。
一致性的建议
愚蠢地使用一致性是无知的妖怪(A Foolish Consistency is the Hobgoblin of Little Minds )。这里的一致性主要是指一个项目内的一致性和一个模块或函式内的一致性,相对于前者而言,后者更为重要。
但最重要的是知道何时会不一致。当出现不一致时,运用自己的最佳判断,看看别的例子,然后决定怎样看起来更好。
代码的布局
缩进
建议使用Emacs 的Python-mode 默认值:4个空格一个缩进层次。对于确实古老的代码,若不希望产生混乱,可以继续使用8空格的制表符。在Emacs 的Python-mode 中会自动发现文件中主要的缩进层次,依此设定缩进参数。如果使用其他的编辑器,如vim 、gedit 、ulipad 等,积极建议把4个空格作为一个缩进层次。
制表符还是空格
永远不要混用制表符和空格,因为如果混用了,虽然在编辑环境中显示两条语句为同一缩进层次,但因为制表符和空格的不同会导致Python 解释为两个不同的层次。 最流行的Python 缩进方式是仅使用空格,其次是仅使用制表符。若一定要混合使用制表符和空格,可以将其转换成仅使用空格。如在Emacs 中,选中整个缓冲区,按ESC+X 键去除制表符。或者在调用Python 命令行解释器时使用-t 选项,可对代码中不合法的混合制表符和空格发出警告,使用-tt 时警告将变成错误,这些选项是被高度推荐的。但是强烈推荐仅使用空格而不是制表符。
关于志向的议论文行的最大长度
有许多设备被限制为每行80字符,窗口也限制为80个字符,因此,建议将所有行限制在最大79字符(Emacs 准确地将行限制为长80字符)。
PCS 7 | Python 编码规范 | 可爱的Python | 75
对顺序摆放的大块文本(文档字符串或注释),推荐将长度限制为72字符。折叠长行的首选方法是使用Pyhon 支持的圆括号、方括号或花括号内的行延续。如果需要,可以在表达式周围增加一对额外的圆括号,但是使用反斜杠看起来会更好,比如下面这个例子:
class Rectangle(Blob):
def __init__(lf, width, height,
color='black', emphasis=None, highlight=0): if width == 0 and height == 0 and \
color == 'red' and emphasis == 'strong' or \ highlight > 100:
rai ValueError, "sorry, you lo"上坟有什么讲究
伶俐是什么意思if width == 0 and height == 0 and (color == 'red' or emphasis is None): rai ValueError, "I don't think so" Blob.__init__(lf, width, height, color, emphasis, highlight)
空行
用两行空行分割顶层函式和类的定义,类内方法的定义用单个空行分割。 额外的空行可被用于分割一组相关函式。在一组相关的单句中间可以省略空行。 当空行用于分割方法的定义时,在class 行和第一个方法定义之间也要有一个空行。 在函式中使用空行时,请谨慎地将它用于表示一个逻辑段落。Python 接受Control+L (即^L )换页符作为空格;Emacs (和一些打印工具)视这个字符为页面分割符,因此在文件中,可以用它们来作为相关片段分页。
导入
通常应该在单独的行中导入,例如:
No: import sys, os Yes: import sys import os
但是这样也是可以的:
from types import StringType, ListType
imports 通常被放置在文件的顶部,仅在模块注释和文档字符串之后,在模块的全局变量和常量之前。imports 应该有顺序地成组安放,顺序依次为:标准库的导入、 相关的主包的导入、特定应用的导入。同时建议在每组导入之间放置一个空行。
对于内部包的导入是不推荐使用相对路径的,而对所有导入都要使用包的绝对路径。
76 | 可爱的P y t h o n | P y t h o n 编码规范 | P C S 7
从一个包含类的模块中导入类时,通常可以写成这样:
from MyClass import MyClass
from foo.bar.YourClass import YourClass
如果这样写导致了本地名字冲突,那么就这样写:
import MyClass
import foo.bar.YourClass
即可以使用MyClass.MyClass 和foo.bar.YourClass.YourClass 这种写法。
空格
建议不要在以下地方出现空格:
紧挨着圆括号、方括号和花括号的地方,如spam( ham[ 1 ], { eggs: 2 } ),要始终将它写成spam(ham[1], {eggs: 2})
紧贴在逗号、分号或冒号前的地方,如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)
工科大学排名
紧贴在索引或切片开始的开式括号前的地方,如dict ['key'] = list [index],要始终将它写成dict['key'] = list[index]
在赋值(或其他)运算符周围,用于和其他并排的一个以上的空格,如:
x = 1 y = 2 long_variable = 3
要始终将它写成
x = 1 y = 2
long_variable = 3
始终在这些二元运算符两边放置一个空格,如赋值(=)、比较(==, <, >, !=, <>, <=,>=, in, not in, is, is not )、布尔运算(and, or, not )。
在算术运算符周围插入空格,始终保持二元运算符两边的空格一致。
不要在用于指定关键字参数或默认参数值的=号周围使用空格。不要将多条语句写在同一行上,如:
No: if foo == 'blah': do_blah_thing() Yes: if foo == 'blah':
PCS 7 | Python 编码规范 | 可爱的Python | 77
do_blah_thing()
No: do_one(); do_two(); do_three() Yes: do_one() do_two() do_three()
文档化
为所有公共模块、函式、类和方法编写文档字符串。文档字符串对非公开的方法不是必要的,但你应该有一个描述这个方法做什么的注释。 多行文档字符串结尾的""" 应该单独成行,例如:
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first. """
对单行的文档字符串,结尾的"""在同一行也可以。
版本注记
如果要将RCS 或CVS 的杂项包含在你的源文件中,按如下格式操作:
__version__ = "$Revision: 1.4 $"
# $Source: E:/cvsroot/python_,v $
对于CVS 的服务器工作标记更应该在代码段中明确出它的使用说明,如在文档最开始的版权声明后应加入如下版本标记: # 文件:$id$ # 版本:$Revision$
这样的标记在提交给配置管理服务器后,会自动适配成为相应的字符串,如:
商业项目
汉字的起源与演变
# 文件:$Id: ussp.py,v 1.22 2004/07/21 04:47:41 hd Exp $ # 版本:$Revision: 1.4 $
这些应该包含在模块的文档字符串之后,所有代码之前,上下用一个空行分割。
命名约定
以下的命名风格是众所周知的。 b (单个小写字母) B (单个大写字母) 小写串 如:getname