ホームページ  >  記事  >  バックエンド開発  >  完璧な Python プロジェクトを構築する

完璧な Python プロジェクトを構築する

coldplay.xixi
coldplay.xixi転載
2020-09-29 16:39:112613ブラウズ

Python ビデオ チュートリアル コラムでは、完璧な Python プロジェクトを構築する方法を紹介します。

完璧な Python プロジェクトを構築する

#新しい Python プロジェクトを開始するときは、すぐにコーディングを開始するのが簡単です。実際、少し時間をかけて優れたライブラリを選択すると、将来の開発にかかる時間を大幅に節約でき、より快適なコーディング エクスペリエンスがもたらされます。

理想的な世界では、すべての開発者の関係は相互依存および関連しており (共同開発)、コードは完全にフォーマットされ、低レベルのエラーがなく、テストはすべてのコードをカバーする必要があります。さらに、これらすべてはコミットごとに保証されます。 (統一されたコードスタイル、型検出、高いテストカバレッジ、自動検出)

今回は、これらの点を実現できるプロジェクトの構築方法を紹介します。手順に従うことも、「Cookiecutter を使用してプロジェクトを構築する」セクション (経験豊富なユーザー向け) に直接ジャンプすることもできます。 まず、新しいプロジェクト ディレクトリを作成しましょう。

mkdir best_practices
cd best_practices复制代码

pipx Python サードパーティ ライブラリをインストールするコマンドライン ツール

Pipx は、Python サードパーティ ライブラリを迅速にインストールするために使用できるコマンドライン ツールです。 -パーティーライブラリ。これを使用して、pipenv と cookiecutter をインストールします。次のコマンドを使用して pipx をインストールします:

python3 -m pip install --user pipx
python3 -m pipx ensurepath复制代码

依存関係管理に Pipenv を使用する

Pipenv は、プロジェクトの virtualenv (仮想環境) を自動的に作成および管理し、パッケージをインストール/アンインストールします。 /Pipfile からパッケージを削除しています。また、依存関係の信頼性を確保するために非常に重要な Pipfile.lock も生成します。

あなたとチームメイトが同じバージョンのライブラリを使用していることが分かると、プログラミングへの自信と楽しさが大幅に高まります。 Pipenv は、同じライブラリを異なるバージョンで使用するという問題をうまく解決しており、過去に広く注目と認知度を高めてきたため、安心して使用できます。インストール コマンドは次のとおりです。

pipx install pipenv复制代码

コードの書式設定に black と isort を使用します

black でコードを書式設定できます:

Black は、妥協のない Python コードの書式設定ライブラリです。これを使用すると、コードの書式設定を手動で調整する詳細を省略できます。その代わりに、Black はスピードと確実性をもたらし、Python コーディング スタイルを調整する手間を省き、より重要なことに集中するためのより多くのエネルギーと時間を確保します。

読んでいるプロジェクトの種類に関係なく、黒でフォーマットされたコードは同じように見えます。しばらくすると、フォーマットの問題が少なくなり、コンテンツに集中できるようになります。

黒は、コードのばらつきを減らすことでコード検査を高速化します。

そして isor はインポート部分をソートします:

isor はインポートする Python パッケージ部分 (インポート) をソートします。そのため、インポートを行う必要はもうありません。手動ソート。インポートをアルファベット順に並べ替え、自動的に部分に分割できます。

デプロイメントが乱雑にならないように、pipenv を使用してインストールします (開発環境にのみインストールするように指定できます):

pipenv install black isort --dev复制代码

Black と isort はデフォルトと互換性がありませんオプションがあるので、isort を黒の原則に従うようにします。

setup.cfg ファイルを作成し、次の構成を追加します:

[isort]
multi_line_output=3
include_trailing_comma=True
force_grid_wrap=0
use_parentheses=True
line_length=88复制代码

次のコマンドを使用してこれらのツールを実行できます:

pipenv run black
pipenv run isort复制代码

コード スタイルを確保するために flake8 を使用します

Flake8 は、コードが PEP8 で定義された標準の Python コーディング規約に従っていることを保証します。 Pipenv を使用してインストールします:

pipenv install flake8 --dev复制代码

isort と同様に、黒で適切に動作するにはいくつかの設定が必要です。これらの設定を

setup.cfg に追加します。

[flake8]
ignore = E203, E266, E501, W503
max-line-length = 88
max-complexity = 18
select = B,C,E,F,W,T4复制代码

これで、コマンド

pipenv run flake8 を使用して flake8 を実行できるようになります。

mypy を使用した静的型チェック

Mypy は、Python の非強制静的型チェッカーであり、動的 (または「ダック」) 型付けと静的型付けの利点を組み合わせるように設計されています。 Mypy は、Python の表現力と利便性を強力な型システムのコンパイル時の型チェックと組み合わせ、本質的に実行時のオーバーヘッドなしで任意の Python VM を使用して実行します。

Python で型を使用するには少し慣れる必要がありますが、その利点は非常に大きいです。次のとおりです。

    #静的型付けにより、プログラムの理解と保守が容易になります。
  • 静的型付けにより、エラーを早期に発見し、テストとデバッグの時間を短縮できます
  • Static入力すると、コードが本番環境に入る前に見つけにくいエラーを見つけるのに役立ちます
  • 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-verifygit 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
pipenv run pre-commit install -t pre-push复制代码

模板项目包含一个非常简单的 Python 文件和测试,可以试用上面这些工具。在编写完代码觉得没问题后,就可以执行第一次 git commit,所有的 hooks 都将运行。

集成到编辑器

虽然在提交时知道项目的代码始终保持最高水准是件令人兴奋的事情。但如果在代码已全部修改完成之后(提交时),再发现有问题还是会让人很不爽。所以,实时暴露出问题要好得多。

在保存文件时,花一些时间确保代码编辑器运行这些命令。有及时的反馈,这意味着你可以在代码还有印象的时候能迅速解决引入的任何小问题。

我个人使用一些出色的 Vim 插件来完成此任务:

  • ale 实时运行 flake8 并在保存文件时运行 black、isort 和 mypy
  • 与 projectionist 集成的 vim-test 在文件保存上运行 pytest

欢迎热爱技术和开源的小伙伴加入 HG 推出的译文亦舞系列的翻译中来,可以留言告诉我们。

更多相关免费学习推荐:python视频教程

以上が完璧な Python プロジェクトを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。