排版
- 缩进统一使用四个空格编写。
- 文件中必须使用UTF-8编码。
- 一行只写一条语句(包括加载模块时,必须每个模块独占一行)。
- 相对独立的程序块之间、以及变量说明之后,必须添加空行。
- 一行长度小于80个字符。
- 操作符前后添加空格(有特殊情况)。
- 模块加载顺序(标准库、第三方关联库、本地特定库、程序),并在这几组导入语句之间添加空行。
- 避免“from ××× import * ”的导入方式,采用“from ××× import yyy”。
- 文件头使用“#!/usr/bin/env python”指定解释器。
注释
- 类和接口的注释写在类声明的下一行,并向后缩进四个空格。内容包括:功能描述需描述类和接口功能,并写明和其他类或接口之间的关系;属性清单列出该类或接口的接口方法的描述;修改记录包括修改人,修改日期和修改内容。
class Testclass():
"""
功能描述:
属性清单:
修改记录:
"""
- 公共函数的注释写在类声明的下一行,并向后缩进四个空格。内容包括:功能描述、输入参数、输出参数、返回值、调用关系、异常描述、修改记录。
def test_fun():
"""
功能描述:
输入参数:
输出参数:
……
"""
- 公共属性的注释写在属性声明的上方,与声明保持同样的缩进。
#Compensate for border
x = x + 1
"""
功 能:XXX类,该类主要涉及XXX功能
版权信息:XXX公司,版本所有(C) 2010-2017
修改记录:2015-3-17 12:00 XXX XXXXXXXX 创建
2017-3-17 12:00 XXX XXXXXXXX 修改 XXX
"""
- 文档字符串多余一行时,末尾的"""要自成一行。
- 注释必须与其描述的代码保持同样的缩进,且位于代码上方。
- 全局变量应该有详细的注释说明。
命名
- 包和模块名使用意义完整的英文描述,风格为小写单词加下划线的组合。
- 类名使用意义完成的英文描述,风格为大写字母开头的单词。
- 函数、方法、函数参数使用意义完整的英文描述,风格为小写单词加下划线的组合。
- 变量使用小写加下划线的风格命名。常量使用大写加下划线的风格命名。
- 类或对象的私有成员使用单下划线开头;对于需要被继承的基类成员,如果想要防止与派生类成员重名,可用双下划线开头。
编码
- 与None比较时采用“is”或“is not”。
- 在模块中定义all,将允许外部访问的变量、函数、类名放进去。
__all__ = ["sample_external_function"]
def sample_external_function():
print("This is an external function..")
def sample_internal_function():
print("This is an internal function..")
- 避免不同对象使用同一命名。
- 类中的方法根据具体场景选择使用@staticmethod或者@classmethod进行修饰。一般的类方法要接收一个self参数表示此类的实例,但有些方法不需要访问实例,这时分为两种情况: 1、方法不需要访问任何成员,或者只需要显式访问这个类自己的成员。这样的方法不需要额外参数,应当用@staticmethod装饰;2、方法不需要访问实例的成员,但需要访问基类或派生类的成员。这时应当用@classmethod装饰。
- 避免在无关变量或无关概念之间重用名字。
异常处理
- try...except...结构对代码作保护时,需在异常后使用finally...结构确保释放操作对象。
- 不要使用except语句来捕获所有异常,每次只捕获一种异常。
- 不在except分支里面的raise都必须带异常。
- 禁止使用except X,x语法,应该使用except X as x。
- assert语句只能使用在测试代码中,禁止在生产版本中包含assert功能。
编程实践
- 函数参数中的可变参数,不要使用默认值,在定义时使用None。
- 对子类继承的变量要做显式定义和赋初值。
- 严禁使用注释行等形式仅使功能失效,不用的功能必须彻底删除。
- 使用os.path库中的方法代替字符串拼接来完成文件系统路径的操作。