创建python项目,python如何创建工程
python视频教程专栏向您展示了如何构建一个完美的Python项目。
当开始一个新的Python项目时,每个人都很容易投入并开始编码。其实花一点时间选择一个优秀的库,会为以后的开发节省很多时间,带来更快乐的编码体验。
在理想的世界中,所有开发人员之间的关系是相互依赖、相互关联的(协同开发),代码应该有完美的格式,没有低级错误,测试覆盖所有代码。此外,所有这些都将在每次提交时得到保证。(统一代码风格,类型检测,高测试覆盖率,自动检测)
在本文中,我将介绍如何构建一个可以完成这些事情的项目。你可以按照步骤或直接跳到使用 cookiecutter 生成项目部分(老兵)。
首先,让我们创建一个新的项目目录:
mkdir最佳实践
Cd best_practices复制代码
pipx 安装 Python 三方库的命令行工具
Pipx是一个命令行工具,可以用来快速安装Python三方库。我们将用它来安装pipenv和cookiecutter。使用以下命令安装pipx:python3 -m pip安装-用户pipx
python 3-m pipx ensure path Copy Code
使用 pipenv 进行依赖管理
Pipenv自动为您的项目创建和管理virtualenv(虚拟环境),在安装/卸载包时从Pipfile中添加/移除包。它还会生成一个非常重要的Pipfile.lock来确保依赖关系的可靠性。当你知道自己和队友用的是同一个库版本的时候,会大大提高编程的信心和乐趣。Pipenv解决了不同版本使用同一个库的问题。Pipenv在过去的一段时间里获得了广泛的关注和认可,大家可以放心使用。安装命令如下:
Pipx安装pipenv复制代码
使用 black 和 isort 进行代码格式化
黑色可以格式化我们的代码:Black是一个不折不扣的Python代码格式化库。通过使用它,您将放弃手动调整代码格式的细节。反过来,黑色可以带来速度、确定性,避免调整Python代码风格的烦恼,从而有更多的精力和时间专注于更重要的事情。
不管你在读什么样的项目,用黑色格式化的代码看起来都差不多。过一段时间,格式就不再是问题了,这样你就可以更专注于内容。
Black通过减少代码差异使代码检查更快。
isort将对我们的进口零件进行分类:
Isort对您导入的Python包部分(导入)进行排序,因此您不必再手动对导入进行排序。它可以按字母顺序对导入进行排序,并自动将其拆分成多个部分。
使用pipenv来安装它,以便它们不会混淆部署(您可以指定只在开发环境中安装它):
Pipenv安装黑isort - dev复制代码黑和isort是不兼容的默认选项,所以我们会让isort遵循黑的原则。创建setup.cfg文件并添加以下配置:
[isort]
多行输出=3
include _ trailing _逗号=True
force_grid_wrap=0
use _括号=True
Line_length=88复制代码我们可以使用以下命令运行这些工具:
黑色运行
Pipenv run isort复制代码
使用 flake8 保证代码风格
Flake8,确保代码遵循PEP8中定义的标准Python代码规范。使用pipenv安装:Pipenv install flake8 - dev复制代码就像isort一样,它需要一些配置才能很好地与black一起工作。将这些配置添加到setup.cfg:
rush:php;toolbar:false;">[flake8]
ignore = E203, E266, E501, W503
max-line-length = 88
max-complexity = 18
select = B,C,E,F,W,T4复制代码现在我们可以运行 flake8 了,命令:pipenv run flake8
。
使用 mypy 进行静态类型检查
Mypy 是 Python 的非强制的静态类型检查器,旨在结合动态(或 “鸭子”)类型和静态类型的优点。Mypy 将 Python 的表达能力和便利性与功能强大的类型系统的编译时类型检查结合在一起,使用任何 Python VM 运行它们,基本上没有运行时开销。在 Python 中使用类型需要一点时间来适应,但是好处却是巨大的。如下:
- 静态类型可以使程序更易于理解和维护
- 静态类型可以帮助您更早地发现错误,并减少测试和调试的时间
- 静态类型可以帮助您在代码投入生产之前发现难以发现的错误
pipenv install mypy --dev复制代码默认情况下,Mypy 将递归检查所有导入包的类型注释,当库不包含这些注释时,就会报错。我们需要将 mypy 配置为仅在我们的代码上运行,并忽略没有类型注释的导入错误。我们假设我们的代码位于以下配置的
best_practices
包中。将此添加到 setup.cfg
:
[mypy]files=best_practices,testignore_missing_imports=true复制代码现在我们可以运行 mypy 了:
pipenv run mypy复制代码这是一个有用的 备忘单 。
用 pytest 和 pytest-cov 进行测试
使用 pytest 编写测试非常容易,消除编写测试的阻力意味着可以快速的编写更多的测试!
pipenv install pytest pytest-cov --dev复制代码这是 pytest 网站上的一个简单示例:
# content of test_sample.pydef inc(x):要执行它:return x + 1def test_answer():
assert inc(3) == 5复制代码
$ pipenv run pytest=========================== test session starts ============================我们所有的测试代码都放在platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 1 item
test_sample.py F [100%]
================================= FAILURES =================================
_______________________________ test_answer ________________________________
def test_answer():> assert inc(3) == 5E assert 4 == 5
E + where 4 = inc(3)
test_sample.py:6: AssertionError
========================= 1 failed in 0.12 seconds =========================复制代码
test
目录中,因此请将此目录添加到 setup.cfg
:
[tool:pytest]如果还想查看测试覆盖率。创建一个新文件testpaths=test复制代码
.coveragerc
,指定只返回我们的项目代码的覆盖率统计信息。比如示例的 best_practices
项目,设置如下:
[run]现在,我们就可以运行测试并查看覆盖率了。source = best_practices
[report]
exclude_lines =
# Have to re-enable the standard pragma
pragma: no cover
# Don't complain about missing debug-only code:
def __repr__
if self\.debug
# Don't complain if tests don't hit defensive assertion code:
raise AssertionError
raise NotImplementedError
# Don't complain if non-runnable code isn't run:
if 0:
if __name__ == .__main__.:复制代码
pipenv run pytest --cov --cov-fail-under=100复制代码
--cov-fail-under=100
是设定项目的测试覆盖率如果小于 100% 那将认定为失败。
pre-commit 的 Git hooks
Git hooks 可让您在想要提交或推送时随时运行脚本。这使我们能够在每次提交/推送时,自动运行所有检测和测试。pre-commit 可轻松配置这些 hooks。
Git hook 脚本对于在提交代码审查之前,识别简单问题很有用。我们在每次提交时都将运行 hooks,以自动指出代码中的问题,例如缺少分号、尾随空白和调试语句。通过在 code review 之前指出这些问题,代码审查者可以专注于变更的代码内容,而不会浪费时间处理这些琐碎的样式问题。在这里,我们将上述所有工具配置为在提交 Python 代码改动时执行(git commit),然后仅在推送时运行 pytest coverage(因为测试要在最后一步)。创建一个新文件
.pre-commit-config.yaml
,配置如下:
repos: - repo: local hooks: - id: isort name: isort stages: [commit] language: system entry: pipenv run isort types: [python] - id: black name: black stages: [commit] language: system entry: pipenv run black types: [python] - id: flake8 name: flake8 stages: [commit] language: system entry: pipenv run flake8 types: [python] exclude: setup.py - id: mypy name: mypy stages: [commit] language: system entry: pipenv run mypy types: [python] pass_filenames: false - id: pytest name: pytest stages: [commit] language: system entry: pipenv run pytest types: [python] - id: pytest-cov name: pytest stages: [push] language: system entry: pipenv run pytest --cov --cov-fail-under=100 types: [python] pass_filenames: false复制代码如果需要跳过这些 hooks,可以运行
git commit --no-verify
或 git push --no-verify
使用 cookiecutter 生成项目
现在,我们已经知道了理想项目中包含了什么,我们可以将其转换为 模板 从而可以使用单个命令生成一个包含这些库和配置的新项目:
pipx run cookiecutter gh:sourcery-ai/python-best-practices-cookiecutter复制代码填写项目名称和仓库名称,将为您生成新的项目。
要完成设置,请执行下列步骤:
# Enter project directorycd <repo_name># Initialise git repogit init# Install dependenciespipenv install --dev# Setup pre-commit and pre-push hookspipenv run pre-commit install -t pre-commit模板项目包含一个非常简单的 Python 文件和测试,可以试用上面这些工具。在编写完代码觉得没问题后,就可以执行第一次pipenv run pre-commit install -t pre-push复制代码
git commit
,所有的 hooks 都将运行。
集成到编辑器
虽然在提交时知道项目的代码始终保持最高水准是件令人兴奋的事情。但如果在代码已全部修改完成之后(提交时),再发现有问题还是会让人很不爽。所以,实时暴露出问题要好得多。在保存文件时,花一些时间确保代码编辑器运行这些命令。有及时的反馈,这意味着你可以在代码还有印象的时候能迅速解决引入的任何小问题。
我个人使用一些出色的 Vim 插件来完成此任务:
- ale 实时运行 flake8 并在保存文件时运行 black、isort 和 mypy
- 与 projectionist 集成的 vim-test 在文件保存上运行 pytest
更多相关免费学习推荐:python视频教程以上就是建立一个完美的Python项目的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。