当开始一个新的Python项目时,很容易没有计划地直接进入编码过程。花一点时间,用最好的工具搭建项目,会节省很多时间,带来更快乐的编码体验。
在一个理想的世界中,所有的开发人员使用相同的依赖库,代码将被完美地格式化,常见的错误将被禁止,测试将覆盖一切。此外,这些需求将在每次提交代码时得到保证。
在这篇文章中,我将介绍如何建立这样一个理想的项目。您可以遵循我的步骤,或者您可以开始安装pipx和pipenv,然后生成一个新项目。
让我们创建一个新的项目目录:
mkdir best_practicescd best_practices
Python命令行工具和pipx
Pipx是一个方便的实用程序,允许快速安装python命令行工具。我们将用它来安装pipenv和cookiecutter。
python3 -m pip install --user pipxpython3 -m pipx ensurepath
使用pipenv进行依赖关系管理
Pipenv自动为您的项目创建和管理virtualenv,并在安装/卸载软件包时从Pipfile中添加/删除软件包。它还生成一个非常重要的Pipfile.lock文件,用于生成确定性的构建。
知道你和你的同事正在使用相同的库版本可以极大地增强信心。Pipenv可以做到这一点,所以在过去一年多的时间里受到了大量开发者的青睐。
pipx install pipenv
使用black和isort进行代码格式化
黑色是一种代码格式化工具:
Black是一个不折不扣的Python代码格式化程序。通过使用它,您同意放弃对手动格式化细节的控制。作为回报,Black为您提供了速度和确定性,您不必处理pycodestyle的繁琐提示。你会有更多的时间去处理更重要的事情。
不管是什么项目,黑色格式化的代码看起来都一样。习惯了之后,就不会再注意到格式的问题了,就可以专注于内容了。
黑色产生的代码差异最小,可以加快代码审查的速度。
Isort用于处理导入的排序:
Isort可以按字母顺序对import进行排序,它会自动分成多个部分。
让我们使用pipenv将它们作为开发依赖库来安装,以免使部署版本更加复杂:
pipenv install black isort --dev
Black和isort的默认选项之间存在冲突,因此我们将覆盖isort的选项配置并使用Black配置。创建setup.cfg文件并添加以下配置:
[isort]multi_line_output=3include_trailing_com***=Trueforce_grid_wrap=0use_parentheses=Trueline_length=88
我们可以像这样运行这些工具:
pipenv run blackpipenv run isort
用flake8提升风格
Flake8确保我们的代码遵循PEP8的约定。使用pipenv安装:
pipenv install flake8 --dev
就像isort一样,它需要一些配置才能与Black一起工作。将此配置添加到setup.cfg:
[flake8]ignore = E203,E266,E501,W503***x-line-length = 88***x-complexity = 18select = B,C,E,F,W,T4
现在我们可以使用pipenv运行flake8来运行flake8。
使用mypy检查静态类型
Mypy是Python中可选的静态类型检查器,旨在结合动态(或“duck”)类型和静态类型的优点。Mypy将Python的表现力和便利性与强大的类型系统和编译时类型检查结合起来。Mypy检查标准Python程序的类型,用Python VM运行Mypy基本没有运行时开销。
习惯使用Python中的类型需要时间,但好处是巨大的。Mypy官网是这样写的:
静态类型可以使程序更容易理解和维护静态类型可以帮助您更早地发现错误,并减少测试和调试静态类型可以帮助您在代码投入生产之前找到难以发现的错误 pipenv install mypy --dev
默认情况下,Mypy将递归地检查所有类型注释的导入,当库不包含这些注释时,这将导致一个错误。我们需要将mypy配置为只在我们的代码上运行,忽略任何没有类型注释的导入错误。我们假设代码存在于具有以下配置的best_practices包中。将以下配置添加到setup.cfg:
[mypy]files=best_practices,testignore_missing_imports=true
现在我们可以运行mypy:
pipenv run mypy
Mypy的快速列表:
https://mypy.readthedocs.io/en/latest/cheatsheetpy3.html
使用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.ycachedir: $PYTHON_PREFIX/.pytest_cacherootdir: $REGENDOC_TMPDIRcollected 1 itemtest_sample.py F [100%]================================= FAILURES =================================_______________________________ test_answer ________________________________ def test_answer():> assert inc(3) == 5E assert 4 == 5E + where 4 = inc(3)test_sample.py:6: AssertionError========================= 1 failed in 0.12 seconds =========================
的所有测试都应该放在测试目录中,所以将这个配置添加到setup.cfg:
[tool:pytest]testpaths=test
我们还想检查测试覆盖了多少代码。创建一个新文件。coveragerc,用于返回应用程序代码的覆盖率统计。让我们再次假设代码位于best_practices模块中:
[run]source = best_practices
[报告]
exclude_lines = #必须重新启用标准prag*** prag***:no cover # Don ’不要抱怨缺少只调试代码:def __repr__ if self。调试# Don & # 8217如果测试不成功,不要抱怨。t命中防御性断言代码:raise assertion error raise NotImplementedError # Don ’不要抱怨不可运行的代码。t run: if 0 : if __name__ =。__***in__。:
现在我们可以运行测试并报告覆盖率。
pipenv run pytest --cov --cov-fail-under=100
如果应用程序代码的测试覆盖率小于100%,它就会失败。
Git预提交挂钩
Git hook允许您在提交或推送时运行脚本。这将使我们能够在每次提交/推送时自动运行所有格式化和测试。预提交可以帮助我们轻松配置这些挂钩:
Git hook脚本可以在提交代码评审之前帮助识别简单的问题。每次提交都要运行钩子,自动指出代码中的问题,比如缺少分号、尾部空单元格、调试语句等。在代码评审之前指出这些问题,可以让代码评审者专注于代码架构的变化,而不是浪费时间检查格式问题。
这里我们配置在提交Python文件修改时执行上述所有检查,推送时只运行pytest覆盖率测试,因为可能需要很长时间。创建一个新文件。预提交配置文件:
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
如果需要跳过这些钩子,可以运行git commit & # 8211无验证或git推送–否-验证
使用cookiecutter生成项目
我们看到了理想项目中使用了哪些工具,可以固化成一个模板。生成一个新项目只需要一个命令:
pipx run cookiecutter gh:sourceryai/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-commitpipenv run pre-commit install -t pre-push
该项目包含一个非常简单的Python文件和测试来试用这些工具。一旦对代码感到满意,就可以提交第一个git,这时所有的钩子都将运行。
本文来自MR.特别人士投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/550340.html