Python 开发规范文档
目录
1.代码风格
-
遵循 PEP 8 标准:所有代码应遵循 PEP 8 风格指南。可以使用工具如
flake8
或pylint
来检查代码风格。 -
行宽限制:每行代码的长度不应超过 80 个字符。对于文档字符串或注释,限制为 72 个字符。
-
缩进:使用 4 个空格进行缩进,不要使用制表符。
-
空行:函数和类之间使用两个空行分隔;方法之间使用一个空行分隔。
-
导入:
5.1 首先导入标准库,然后是第三方库,最后是本地应用/库特定的导入;
5.2 尽可能使用绝对导入;正确示例:
import os import sys from third_party import some_module from my_project import my_module class MyClass: def __init__(self, value): self.value = value def my_method(self): return self.value
错误示例:
import sys, os from my_project import my_module from third_party import some_module class MyClass: def __init__(self, value): self.value = value def my_method(self): return self.value
2.命名约定
通用原则
- 描述性命名:使用描述性命名,使变量、函数和类名具有自解释性。
- 命名风格:不同类型的标识符遵循特定的命名风格。
-
常量
- 使用
UPPER_CASE
命名常量。
正确示例:
MAX_RETRIES = 5
错误示例:
max_retries = 5
- 使用
-
变量和函数
- 使用
snake_case
命名变量和函数。
正确示例:
def calculate_sum(a, b): total_sum = a + b return total_sum
错误示例:
def CalculateSum(a, b): totalSum = a + b return totalSum
- 使用
-
类
- 使用
CamelCase
命名类。
正确示例:
class DataProcessor: def __init__(self, data): self.data = data
错误示例:
class data_processor: def __init__(self, data): self.data = data
- 使用
-
模块和包
- 模块名尽量使用短小的全小写字母,并可使用下划线。
- 包名尽量使用短小的全小写字母,不使用下划线。
# 模块名 import my_module import example_module # 包名 import mypackage import tools
-
文件名命名规范
- 小写字母:文件名应使用小写字母。
- 下划线分隔:单词之间使用下划线
_
分隔,而不是使用连字符-
或空格。 - 简洁明了:文件名应简洁明了,能够清楚地表达文件的内容和用途。
- 避免特殊字符:避免使用特殊字符(如
!@#$%^&*()
),只使用字母、数字和下划线。
正确: my_module.py, utils.py, data_processing.py 错误: MyModule.py, utils-file.py, data processing.py
-
特殊类型文件
- 配置文件:如
config.py
、settings.py
,应放置在项目的根目录或专门的配置目录下。 - 测试文件:测试文件应以
test_
开头,如test_module1.py
、test_utils.py
,并放置在tests
目录下。 - 脚本文件:如
run_analysis.py
、generate_report.py
,应放置在专门的scripts
目录下。 - 数据文件:如
data.csv
、dataset.json
,应放置在data
目录下。
- 配置文件:如
3. 函数设计
- 函数长度: 函数应尽量简短,确保每个函数只做一件事。
- 参数数量: 尽量减少函数的参数数量,超过三个参数时考虑使用数据类(dataclass)或对象来传递。
- 返回值: 函数应该只返回必要的值,避免返回多余的信息。
4. 面向对象设计原则
- 单一职责原则 (SRP): 每个类应该只有一个职责,避免类承担过多功能。
- 开闭原则 (OCP): 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
- 里氏替换原则 (LSP): 子类对象必须能够替换其基类对象而不改变程序的正确性。
- 接口隔离原则 (ISP): 使用多个专门的接口,而不是一个通用的接口,确保接口只包含客户需要的方法。
- 依赖倒置原则 (DIP): 高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
5.文档与注释
5.1 文档
-
使用文档字符串(docstring)记录所有公共模块、函数、类和方法。
-
文档字符串采用reStructuredText(reST)风格。
-
增加添加类型提示的规范
正确示例:
def add(a, b): """ Add two numbers. :param a: First number. :param b: Second number. :return: Sum of a and b. """ return a + b
错误示例:
def add(a, b): # Adds two numbers return a + b
目录结构示例
project/ ├── README.md ├── requirements.txt ├── setup.py ├── config/ │ ├── config.py │ └── settings.py ├── module1/ │ ├── __init__.py │ ├── data_processing.py │ └── utils.py ├── module2/ │ ├── __init__.py │ ├── data_analysis.py │ └── visualization.py ├── tests/ │ ├── __init__.py │ ├── test_data_processing.py │ └── test_utils.py ├── scripts/ │ ├── run_analysis.py │ └── generate_report.py └── data/ ├── data.csv └── dataset.json
5.2 注释
-
文档字符串:每个公共模块、函数、类和方法都应编写文档字符串。使用三引号(“”" “”")括起来,并简要描述功能。
-
内联注释:尽量减少使用内联注释,仅在必要时使用,并将其与代码用两个空格隔开。
-
块注释:用于解释复杂的代码段,使用
#
开头,每行都需要#
。def add(a, b): """ 返回 a 和 b 的和。 参数: a (int): 第一个加数。 b (int): 第二个加数。 返回: int: 和。 """ return a + b
6.错误和异常处理
-
使用适当的异常类型:尽量使用内置异常类,并确保异常的类型与实际错误相符。
-
提供有用的错误消息:在引发异常时,提供清晰、有用的错误消息。
-
避免空的 except 块:避免捕获所有异常而不做处理,至少记录日志或重新引发异常。
try: result = 10 / 0 except ZeroDivisionError as e: print(f"Error: {e}")
7.代码结构和模块化
-
模块化:将代码划分为模块和包,以提高代码的可维护性和可重用性。
-
单一责任原则:每个模块、类或函数应该只承担一个责任或功能。
-
避免循环依赖:确保模块之间的依赖关系是单向的,避免循环导入。
# 目录结构示例 project/ ├── module1.py ├── module2.py ├── package/ │ ├── __init__.py │ ├── submodule1.py │ └── submodule2.py └── main.py
8.测试
-
编写测试:为每个模块和函数编写单元测试。使用
unittest
、pytest
或其他测试框架。 -
测试覆盖率:确保测试覆盖率达到一定的标准,例如 80% 或更高。
-
持续集成:使用持续集成工具(如 GitHub Actions、Travis CI)自动运行测试。
import unittest class TestMyFunction(unittest.TestCase): def test_add(self): self.assertEqual(add(2, 3), 5) if __name__ == '__main__': unittest.main()
9.版本控制
-
使用 Git:所有代码应使用 Git 进行版本控制。
-
提交信息:提交信息应简洁明了,描述所做的更改。
-
分支模型:使用分支模型(如 Git Flow)管理开发流程。
git init git add . git commit -m "Initial commit"
10.依赖管理
-
使用虚拟环境:使用
venv
或virtualenv
创建隔离的 Python 环境。 -
依赖文件:使用
requirements.txt
或Pipfile
列出项目依赖。# 创建虚拟环境 python -m venv venv # 激活虚拟环境 source venv/bin/activate # Unix/macOS venv\Scripts\activate # Windows # 安装依赖 pip install -r requirements.txt
11.性能和优化
-
避免过早优化:在确保代码正确性的基础上,再进行性能优化。
-
使用分析工具:使用
cProfile
、line_profiler
等工具分析代码性能。 -
提高算法效率:选择合适的数据结构和算法,以提高代码效率。
import cProfile def my_function(): pass cProfile.run('my_function()')
12.安全性
-
输入验证:对用户输入进行验证和清理,防止注入攻击。
-
敏感信息:不要在代码中硬编码敏感信息,如密码和 API 密钥。
-
依赖更新:定期更新依赖库,确保使用最新的安全补丁。
import os # 从环境变量读取敏感信息 API_KEY = os.getenv('API_KEY')
以上是 Python 开发的详细规范文档,希望能够帮助您和您的团队在开发过程中保持代码的一致性和高质量。