Maison  >  Article  >  développement back-end  >  Construisez un projet Python parfait

Construisez un projet Python parfait

coldplay.xixi
coldplay.xixiavant
2020-09-29 16:39:112613parcourir

La colonne

tutoriel vidéo Python présente comment créer un projet Python parfait.

Construisez un projet Python parfait

Lors du démarrage d'un nouveau projet Python, il est facile de se lancer et de commencer à coder. En fait, prendre un peu de temps pour choisir d'excellentes bibliothèques permettra de gagner beaucoup de temps dans les développements futurs et d'apporter une expérience de codage plus heureuse.

Dans un monde idéal, la relation entre tous les développeurs est interdépendante et liée (développement collaboratif), le code doit être parfaitement formaté, il n'y a pas d'erreurs de bas niveau et les tests couvrent tout le code. De plus, tout cela sera garanti à chaque commit. (Style de code uniforme, détection de type, couverture de test élevée, détection automatique)

Dans cet article, je vais vous présenter comment construire un projet capable d'atteindre ces points. Vous pouvez suivre les étapes ou accéder directement à la section Créer un projet à l'aide de cookiecutter (pour les utilisateurs expérimentés). Tout d'abord, créons un nouveau répertoire de projet :

mkdir best_practices
cd best_practices复制代码

pipx Un outil de ligne de commande pour installer des bibliothèques tierces Python

Pipx est un outil de ligne de commande qui peut être utilisé pour installer rapidement des bibliothèques tierces Python. bibliothèques du parti. Nous l'utiliserons pour installer pipenv et cookiecutter. Installez pipx via la commande suivante :

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

Utilisez pipenv pour la gestion des dépendances

Pipenv crée et gère automatiquement virtualenv (environnement virtuel) pour votre projet, et installe/désinstalle des packages lors de l'ajout/ suppression de packages de Pipfile. Il générera également le très important Pipfile.lock pour assurer la fiabilité des dépendances.

Cela augmentera considérablement la confiance et le plaisir de la programmation lorsque vous saurez que vous et vos coéquipiers utilisez la même version de la bibliothèque. Pipenv résout bien le problème de l'utilisation de la même bibliothèque avec différentes versions. Pipenv a gagné en attention et en reconnaissance au cours de la période passée, et vous pouvez l'utiliser en toute confiance. La commande d'installation est la suivante :

pipx install pipenv复制代码

Utilisez black et isort pour le formatage du code

black peut formater notre code :

Black est une bibliothèque de formatage de code Python sans compromis. En l'utilisant, vous renoncerez aux détails de l'ajustement manuel du formatage du code. En retour, Black apporte rapidité, certitude et évite les tracas liés à l'ajustement du style de codage Python, laissant plus d'énergie et de temps pour se concentrer sur des choses plus importantes.

Quel que soit le type de projet que vous lisez, le code formaté en noir aura le même aspect. Après un certain temps, le formatage devient moins problématique et vous pouvez vous concentrer davantage sur le contenu.

le noir accélère l'inspection du code en réduisant la variabilité du code.

Et isor trie notre partie importations :

isor trie les parties du package Python (importations) que vous importez, vous n'avez donc plus à faire d'importations. Tri manuel. Il peut trier les importations par ordre alphabétique et les diviser automatiquement en parties.

Utilisez pipenv pour l'installer afin de ne pas encombrer le déploiement (vous pouvez spécifier d'installer uniquement dans l'environnement de développement) :

pipenv install black isort --dev复制代码

Black et isort ne sont pas compatibles avec les options par défaut , nous ferons donc en sorte que le tri suive le principe du noir. Créez un setup.cfg fichier et ajoutez la configuration suivante :

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

Nous pouvons exécuter ces outils à l'aide de la commande suivante :

pipenv run black
pipenv run isort复制代码

Utilisez flake8 pour garantir le style de code

Flake8 assure Que le Code respecte PEP8 Conventions de codage Python standard définies dans . Installez en utilisant pipenv :

pipenv install flake8 --dev复制代码

Tout comme isort, cela nécessite une certaine configuration pour bien fonctionner avec le noir. Ajoutez ces configurations à setup.cfg :

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

Nous pouvons maintenant exécuter flake8, commande : pipenv run flake8.

Vérification de type statique avec mypy

Mypy est un vérificateur de type statique non exécutoire pour Python, conçu pour combiner les avantages du typage dynamique (ou "canard") et du typage statique. Mypy combine la puissance expressive et la commodité de Python avec la vérification de type au moment de la compilation d'un système de types puissant, les exécutant à l'aide de n'importe quelle machine virtuelle Python sans pratiquement aucune surcharge d'exécution.

Utiliser des types en Python prend un peu de temps pour s'y habituer, mais les avantages sont énormes. Comme suit :

  • Le typage statique peut rendre les programmes plus faciles à comprendre et à maintenir
  • Le typage statique peut vous aider à détecter les erreurs plus tôt et à réduire le temps de test et de débogage
  • Typage statique peut vous aider à détecter les bugs difficiles à trouver avant que votre code ne passe en production
pipenv install mypy --dev复制代码

Par défaut, Mypy vérifiera de manière récursive les annotations de type de tous les packages importés et lorsque la bibliothèque ne contient pas ces annotations, ce sera Une erreur sera signalée. Nous devons configurer mypy pour qu'il s'exécute uniquement sur notre code et ignorer les erreurs d'importation sans annotations de type. Nous supposons que notre code se trouve dans le package best_practices configuré ci-dessous. Ajoutez ceci à setup.cfg :

[mypy]files=best_practices,testignore_missing_imports=true复制代码

Maintenant, nous pouvons exécuter mypy :

pipenv run mypy复制代码

Voici une aide-mémoire utile.

用 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视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer