python项目开发&管理
- 基础环境管理
- 编码规范&规范化
- 单元测试规范
环境管理
- 使用Anaconda和Pipenv共同管理Python环境(需细化)
- 包管理(自研、第三方)
- 自动化
- poetry 依赖、打包、构建、区分环境 (https://python-poetry.org/docs/master/)
- poetry build # 构建可安装的 *.whl 和 tar.gz 文件
- poetry shell # 会根据定义在 pyproject.toml 文件中的依赖创建并使用虚拟环境
- poetry run pytest # 运行使用 pytest 的测试用例,如 tests/test_sample.py
- poetry run python -m unittest tests/sample_tests.py # 运行 unittest 测试用例
- poetry export --without-hashes --output requirements.txt # 导出 requirements.txt 文件, --dev 导出含 dev 的依赖,或者用 poetry export --without-hashes > requirements.txt
示例:
1. 创建项目
peotry new --src app_ppid
修改READMD.rst 文件格式 cd app_id && mv README.rst README.md
创建数据清洗目录
mkdir -p src/app_ppid/dataclean/udms && cp src/app_ppid/__init__.py src/app_ppid/dataclean && cp src/app_ppid/__init__.py src/app_ppid/dataclean/udms
mkdir -p src/app_ppid/dataclean/common && cp src/app_ppid/__init__.py src/app_ppid/dataclean/common
mkdir -p src/app_ppid/dataclean/resources
创建爬虫目录
2. 安装
从pyproject.toml文件中读取依赖,并安装poetry install
poetry install --without dev --sync
poetry install --with docs --sync
poetry install --only dev
3. 安装单个包
poetry add requests pendulum
poetry add pendulum@^2.0.5 poetry add "pendulum>=2.0.5"
poetry add requests --dev
4. 编译打包
poetry build
5. 测试
poetry run
项目结构
-- app_ppid # 项目名称
-- readme.md # 说明文档
-- pyproject.toml # 项目管理配置文件
-- tests # 项目测试总目录
-- src # 项目源码主目录
-- app_ppid # 数据清洗总目录
-- udms # udm 模块
-- qcc_region_list_task # udmd2
-- common # 项目共用代码包
-- utils # 包1
-- resources # 资源文件
-- collie_version.txt # 版本文件
-- data_pump # data_pump 配置文件
-- 其他资源文件
--- spider # 爬虫总目录
-- scrapy # scrapy 型爬虫
-- udms # udm 型爬虫
-- resources # 资源文件
主要包括数据清洗(dataclean)、爬虫(spider)、测试(test) 3个部分
- 代码中import使用完整包路径,不能使用相对引用。pycharm中右键项目app_person_id, Mark Directory as Source Root
- 测试代码路径与源代码路径保持一致。
1. 数据清洗(dataclean)
分为代码(src)、资源文件(resource)两个目录
- 代码src,存放代码文件: .py、.sh、.java、.scala等
- 资源文件resources, 存放资源文件,比如.txt、.yml、.conf、.json等资源类文件
2. 爬虫(spider)
分为scrapy、udms、resources三个目录
- scrapy 爬虫
- udms 非scrapy爬虫
- resources 资源文件
3. 测试(test)
根据数据清洗、爬虫的代码路径,实际生成对应路径的测试用例代码
4. readme.md
编码规范&规范化
PEP8
需细化
- 遵从PEP8规范写代码
- 理解PEP8指导原则的原因
- 配置符合PEP8标准开发环境
单元测试规范
- 单元测试
- 框架
- 规范
- 示例
pytest 框架
- 兼容性好: 支持 Python 2.7,Python 3.4+。
- 与 unittest 和 nose 测试框架兼容: 如果之前测试用例全部是基于 unittest 或者 nose 来编写的,执行 Pytest 命令同样可以正常运行并得到结果。
- 丰富的插件支持: 大约有 300 多个,像 Pytest-repeat, pytest-xdist,pytest-ordering,pytest-rerunfailures 以及 pytest-html 这些常用插件在测试重复执行、并发与生成报告方面都提供了非常强大的支持。
- 允许直接使用 assert 进行断言:相比 unittest 简单,unittest 定义了 assertEqual、assertIn、assertTrue、assertFalse 等一系列断言。
- 可以自动寻找单测文件、类和函数:Pytest 要求所有的单测文件名都需要满足 test_.py 格式或_test.py 格式。在单测文件中,可以包含 test_ 开头的函数,也可以包含 Test 开头的类。在单测类中,可以包含一个或多个 test_ 开头的函数。在执行 Pytest 命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。
- 提供应用不同范围前置/后置方法: Pytest 提供了模块级、函数级、类级、方法级的setup/teardown,比 unittest 的 setUp/tearDown 更灵活。
- 分类执行与测试数据参数化简单 : unittest 需依赖 ddt 库实现数据参数化,而 Pytest 直接使用@pytest.mark.parametrize 装饰器。