# 02-Python 编码规范 > 以 PEP8 为基础,结合中国电信实际整理 ## 1. 命名规范 ### 包和模块 - **【强制】** 包命名全小写 - **【推荐】** 通过功能命名 - **【推荐】** 模块名全小写,多单词用下划线连接 ### 类 - **【强制】** 驼峰命名(大写开头:`ClassName`) - **【推荐】** 接口已文档化时可用函数命名风格 ### 函数 - **【推荐】** 全小写,下划线连接单词(`do_something`) - **【强制】** 单下划线 `_` 开头 = protected 模块函数 - **【强制】** 双下划线 `__` 开头 = 类内私有 ### 变量 - **【强制】** 全小写,下划线连接 - **【强制】** 单下划线开头 = protected,双下划线开头 = 类内私有 - **【推荐】** 全局变量适用函数命名规范 ### 常量 - **【推荐】** 全大写 + 下划线(`MAX_SIZE`) ### 异常类 - **【推荐】** 若抛出错误,异常名加 `Error` 后缀 ### 通用原则 - **【推荐】** 名字使用英文单词,不能用拼音 - **【推荐】** 3~30 个字母,不超过 4 个单词 - **【强制】** 命名不能和关键字冲突 --- ## 2. 注释规范 ### 文件注释 - **【强制】** 使用文档字符串(三个双引号) - **【参考】** 应包含:描述(Description)、作者(Author)、版本(Version)、日期(Date)、记录(Record) ### 类注释 - **【强制】** 类定义下必须有文档字符串 - **【推荐】** 有公共属性时,文档中应有 Attributes 段 ### 函数注释 - **【强制】** 外部可见函数必须有文档字符串(非常短小/简单明了的除外) - **【强制】** 文档字符串应描述做什么、输入/输出 - **【参考】** 使用 Args / Returns / Raises 格式 ### 通用注释原则 - **【推荐】** 有效注释量 ≥ 30% - **【强制】** 避免装饰性内容,保持简洁;避免行尾注释 - **【强制】** 复杂分支流程必须注释 - **【推荐】** 代码质量不高但能运行用 `# TODO:`;有隐患用 `# FIXME:` --- ## 3. 格式规范 ### 缩进 - **【强制】** 4 个空格,禁止混用空格和 Tab ### 换行 - **【推荐】** 每行 ≤ 80 字符(导入语句和 URL 除外) ### 空行 - **【强制】** 顶层函数/类之间 2 个空行 - **【强制】** 类中方法之间 1 个空行 ### 导入 - **【强制】** 每个导入独占一行(`import` 开头时) - **【强制】** 导入顺序:标准库 → 第三方库 → 应用指定 - **【推荐】** 推荐绝对路径导入 - **【强制】** 禁止隐式相对导入(如 `import bench`) - **【推荐】** 可使用显式相对导入(`from . import bench`) ### 字符串 - **【强制】** 避免循环中用 `+` 或 `+=` 累加字符串(用 `join`) - **【推荐】** 同一文件内单/双引号保持一致 ### 空值比较 - **【推荐】** 使用 `if foo is None:` 而非 `if foo == None:` ### 空格 - **【推荐】** 二元运算符两侧各一个空格 - **【强制】** 函数名和参数列表的 `(` 之间不加空格 - **【推荐】** 逗号、分号、冒号前面不加空格 ### 关系运算 - **【强制】** 常量在左、变量在右(如 `if None is foo:`) --- ## 4. 安全编码(与安全分册交叉) - **【强制】** 禁止在日志中保存口令、密钥 - **【强制】** 禁止使用私有/弱加密算法(必须用 SM4/SM2/SM3) - **【强制】** 口令哈希存储必须加入盐值(至少 8 字节随机数,迭代 50000+ 次) - **【强制】** 禁止硬编码敏感信息 - **【强制】** 使用强随机数(`secrets` 模块或 `os.urandom`) - **【强制】** 类型变量定义统一放在 `import` 之后 - **【强制】** 类变量放在类注释之后、所有类函数之前