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 は、Python の非強制静的型チェッカーであり、動的 (または「ダック」) 型付けと静的型付けの利点を組み合わせるように設計されています。 Mypy は、Python の表現力と利便性を強力な型システムのコンパイル時の型チェックと組み合わせ、本質的に実行時のオーバーヘッドなしで任意の Python VM を使用して実行します。Python で型を使用するには少し慣れる必要がありますが、その利点は非常に大きいです。次のとおりです。
pipenv install mypy --dev复制代码
best_practices パッケージ内にあると仮定します。これを
setup.cfg に追加します:
[mypy]files=best_practices,testignore_missing_imports=true复制代码これで、mypy を実行できるようになります:
pipenv run mypy复制代码これは便利なチートシートです。
使用 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% 那将认定为失败。
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
现在,我们已经知道了理想项目中包含了什么,我们可以将其转换为 模板 从而可以使用单个命令生成一个包含这些库和配置的新项目:
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 插件来完成此任务:
欢迎热爱技术和开源的小伙伴加入 HG 推出的译文亦舞系列的翻译中来,可以留言告诉我们。
更多相关免费学习推荐:python视频教程
以上が完璧な Python プロジェクトを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。