1 遵循命名规范
模块命名应该:
- 使用小写字母和下划线(snake_case)
- 避免使用Python关键字和内置模块名
- 具有描述性且简洁
反例: MyModule.py
, math.py
正例: data_utils.py
, report_generator.py
10个关键注意点与最佳实践
在Python开发中,模块是组织代码的基本单元。自定义模块可以帮助您:
然而,创建高质量的自定义模块需要注意许多细节。本文将介绍10个关键注意点。
模块命名应该:
反例: MyModule.py
, math.py
正例: data_utils.py
, report_generator.py
每个模块顶部应该包含一个文档字符串,说明模块的目的、主要功能和用法。
"""
数据预处理工具集
提供常用的数据清洗、转换和特征工程功能
主要功能:
- 处理缺失值
- 标准化/归一化
- 分类变量编码
- 特征选择
示例:
>>> from data_utils import clean_missing_values
>>> df = clean_missing_values(df, strategy='mean')
"""
模块导入时不应执行任何实质性操作(除了初始化)。将所有可执行代码封装在函数或if __name__ == '__main__':
块中。
# 反例: 模块导入时立即执行操作
print("Initializing module...") # 导入时会立即执行
# 正例: 将执行代码放在main保护块中
def main():
print("This runs only when executed directly")
if __name__ == '__main__':
main()
在包目录中,__init__.py
文件用于:
# my_package/__init__.py
from .module1 import feature1, feature2
from .subpackage import helper_function
__version__ = "1.0.0"
__all__ = ['feature1', 'feature2', 'helper_function']
使用__all__
变量明确指定模块的公共API:
# 在 my_module.py 中
__all__ = ['public_function', 'PublicClass']
def public_function():
pass
def _private_function():
pass
class PublicClass:
pass
class _PrivateClass:
pass
循环导入会导致运行时错误。解决方法:
# 模块A.py
# 反例: 在顶部导入模块B
import moduleB # 如果模块B也导入模块A,会导致循环导入
# 正例: 在函数内部导入
def some_function():
import moduleB # 延迟导入
# 使用moduleB
使用__version__
属性管理模块版本:
# 在模块顶部定义
__version__ = "1.2.3"
# 在setup.py中使用
setup(
name="my_module",
version=__version__,
# ...
)
设计模块结构时考虑导入体验:
# 反例: 嵌套过深
from my_package.utils.helpers.strings import sanitize_input
# 正例: 合理使用__init__.py扁平化导入
from my_package import sanitize_input
为模块编写测试,并放置在tests目录中:
项目结构示例:
my_module/ ├── my_module/ # 主包 │ ├── __init__.py │ ├── core.py │ └── utils.py ├── tests/ # 测试目录 │ ├── test_core.py │ └── test_utils.py ├── setup.py └── README.md
使用setuptools创建setup.py文件,方便模块分发:
from setuptools import setup, find_packages
setup(
name="my_utility",
version="0.1.0",
packages=find_packages(),
install_requires=[
'requests>=2.25',
'pandas>=1.2'
],
author="Your Name",
description="A collection of utility functions",
long_description=open('README.md').read(),
long_description_content_type="text/markdown",
url="https://github.com/you/my_utility",
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License"
]
)
"""
math_operations.py - 基本数学运算工具
提供常用数学运算函数,包括:
- 加法
- 减法
- 乘法
- 除法
- 阶乘
版本: 1.0.0
"""
__all__ = ['add', 'subtract', 'multiply', 'divide', 'factorial']
__version__ = "1.0.0"
def add(a, b):
"""返回两个数字的和"""
return a + b
def subtract(a, b):
"""返回两个数字的差 (a - b)"""
return a - b
def multiply(a, b):
"""返回两个数字的乘积"""
return a * b
def divide(a, b):
"""
返回两个数字的商 (a / b)
参数:
a (float): 分子
b (float): 分母 (不能为零)
返回:
float: a除以b的结果
异常:
ValueError: 如果b为零
"""
if b == 0:
raise ValueError("除数不能为零")
return a / b
def factorial(n):
"""
计算非负整数的阶乘
参数:
n (int): 非负整数
返回:
int: n的阶乘
异常:
ValueError: 如果n为负数
"""
if n < 0:
raise ValueError("阶乘只定义在非负整数")
result = 1
for i in range(1, n + 1):
result *= i
return result
# 模块测试代码
if __name__ == '__main__':
print("运行模块测试...")
assert add(2, 3) == 5
assert subtract(5, 2) == 3
assert multiply(3, 4) == 12
assert divide(10, 2) == 5
assert factorial(5) == 120
print("所有测试通过!")
创建高质量的Python自定义模块需要关注多个方面:
最佳实践提示: 在开发模块时,始终考虑其他开发者将如何使用您的代码。编写清晰文档、设计直观API和提供实用示例,将大大提升模块的可用性和受欢迎程度。
本文由YinGui于2025-07-26发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20256535.html
发表评论