如何建立一个完美的 Python 项目( 二 )

pipenv install mypy --dev默认情况下,Mypy 将递归检查所有导入包的类型注释,当库不包含这些注释时,就会报错 。我们需要将 mypy 配置为仅在我们的代码上运行,并忽略没有类型注释的导入错误 。我们假设我们的代码位于以下配置的 best_practices 包中 。将此添加到 setup.cfg :
[mypy]files=best_practices,testignore_missing_imports=true现在我们可以运行 mypy 了:
pipenv run mypy这是一个有用的 备忘单[7]  。
用 pytest 和 pytest-cov 进行测试使用 pytest[8] 编写测试非常容易,消除编写测试的阻力意味着可以快速的编写更多的测试!
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 =========================我们所有的测试代码都放在 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 hooksGit hooks 可让您在想要提交或推送时随时运行脚本 。这使我们能够在每次提交/推送时,自动运行所有检测和测试 。pre-commit[9] 可轻松配置这些 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


推荐阅读