Python 包
什么是 Python 包
Python 包是一种组织 Python 模块的方式,它允许我们将相关的模块组织在一起,形成一个更大的应用程序或库。包本质上是一个包含__init__.py文件的目录,这个文件可以是空文件,也可以包含包的初始化代码。
包的基本结构
一个典型的 Python 包结构如下:
mypackage/
│
├── __init__.py
├── setup.py
├── README.md
├── requirements.txt
│
├── mypackage/
│ ├── __init__.py
│ ├── module1.py
│ └── module2.py
│
└── tests/
├── __init__.py
└── test_module1.py
创建包
1. 基本步骤
- 创建包目录结构
- 添加
__init__.py文件 - 创建
setup.py文件 - 编写包文档
2. setup.py 示例
from setuptools import setup, find_packages
setup(
name="mypackage",
version="0.1.0",
packages=find_packages(),
install_requires=[
"requests>=2.25.1",
"pandas>=1.2.0",
],
author="Your Name",
author_email="your.email@example.com",
description="A short description of your package",
long_description=open("README.md").read(),
long_description_content_type="text/markdown",
url="https://github.com/yourusername/mypackage",
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires=">=3.6",
)
包的发布
1. 本地安装
pip install -e .
2. 发布到 PyPI
- 安装必要的工具:
pip install build twine
- 构建包:
python -m build
- 上传到 PyPI:
python -m twine upload dist/*
包的使用
1. 导入包
# 导入整个包
import mypackage
# 导入特定模块
from mypackage import module1
# 导入特定函数或类
from mypackage.module1 import my_function
2. 包的相对导入
# 在同一包内使用相对导入
from . import module1
from .. import parent_module
最佳实践
版本控制
- 遵循语义化版本控制(Semantic Versioning)
- 在
setup.py中明确指定版本号
依赖管理
- 在
requirements.txt中列出所有依赖 - 指定依赖的版本范围
- 在
文档
- 为包编写清晰的 README.md
- 使用 docstring 记录代码
- 提供使用示例
测试
- 编写单元测试
- 使用 pytest 或 unittest 框架
- 保持测试覆盖率
代码质量
- 使用 flake8 进行代码风格检查
- 使用 mypy 进行类型检查
- 遵循 PEP 8 规范
常见问题
循环导入
- 避免模块之间的循环依赖
- 使用延迟导入或重构代码结构
命名空间冲突
- 使用有意义的包名
- 避免与标准库或常用包重名
包的大小
- 合理组织代码结构
- 考虑使用子包来组织大型项目
工具推荐
开发工具
- Poetry:现代 Python 包管理工具
- Black:代码格式化工具
- isort:import 语句排序工具
测试工具
- pytest:测试框架
- coverage:代码覆盖率工具
- tox:自动化测试工具
文档工具
- Sphinx:文档生成工具
- Read the Docs:文档托管服务
