建立一个完美的Python项目-Python教程

资源魔 59 0
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 很好地处理了应用相反的库,版本没有同的这一成绩,Pipenv 正在过来的一段工夫里取得了宽泛的存眷以及认可,你能够释怀应用。装置饬令以下:

pipx install pipenv复制代码

应用 black 以及 isort 进行代码格局化

black 能够格局化咱们的代码:

Black 是绝不妥协的 Python 代码格局化库。经过应用它,你将保持手动调整代码格局的细节。作为报答,Black 能够带来速率、确定性以及防止调整 Python 代码格调的懊恼,从而有更多的精力以及工夫放正在更首要的事件上。

无论你在浏览甚么样的名目,用 black 格局化过的代码看起来都差没有多。一段工夫后格局再也不是成绩,这样你就能够更专一于内容。

black 经过缩小代码的差别性,使代码反省更快。

而 isort 是对咱们的 imports 局部进行排序:

isort 为您导入的 Python 包局部(imports)进行排序,因而你不用再对 imports 进行手动排序。它能够按字母程序对导入进行排序,并主动将其拆分红多个局部。

应用 pipenv 装置它,以便它们没有会使部署凌乱(能够指定只正在开发环境装置):

pipenv install black isort --dev复制代码

Black 以及 isort 其实不兼容的默许选项,因而咱们将让 isort 遵照 black 的准则。创立一个 setup.cfg 文件并增加如下设置装备摆设:

[isort]
multi_line_output=3
include_trailing_co妹妹a=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 同样,它需求一些设置装备摆设能力很好地与 black 合营应用。将这些设置装备摆设增加到 setup.cfg

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

如今咱们能够运转 flake8 了,饬令:pipenv run flake8

应用 mypy 进行动态类型反省

Mypy 是 Python 的非强迫的动态类型反省器,旨正在连系静态(或 “鸭子”)类型以及动态类型的优点。Mypy 将 Python 的表白才能以及便当性与性能弱小的类型零碎的编译时类型反省连系正在一同,应用任何 Python VM 运转它们,根本上不运转时开支。

正在 Python 中应用类型需求一点工夫来顺应,然而益处倒是微小的。以下:

  • 动态类型能够使顺序更容易于了解以及保护
  • 动态类型能够协助您更早地发现谬误,并缩小测试以及调试的工夫
  • 动态类型能够协助您正在代码投入消费以前发现难以发现的谬误
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-co妹妹it 的 Git hooks

Git hooks 可以让您正在想要提交或推送时随时运转剧本。这使咱们可以正在每一次提交/推送时,主动运转一切检测以及测试。pre-co妹妹it 可轻松设置装备摆设这些 hooks。

Git hook 剧本关于正在提交待码审查以前,辨认简略成绩颇有用。咱们正在每一次提交时都将运转 hooks,以主动指出代码中的成绩,例如短少分号、跟随空缺以及调试语句。经过正在 code review 以前指出这些成绩,代码审查者能够专一于变卦的代码内容,而没有会糜费工夫解决这些琐碎的款式成绩。

正在这里,咱们将上述一切对象设置装备摆设为正在提交 Python 代码改动时执行(git co妹妹it),而后仅正在推送时运转 pytest coverage(由于测试要正在最初一步)。创立一个新文件 .pre-co妹妹it-config.yaml,设置装备摆设以下:

repos:  - repo: local    hooks:      - id: isort        name: isort        stages: [co妹妹it]        language: system        entry: pipenv run isort        types: [python]      - id: black        name: black        stages: [co妹妹it]        language: system        entry: pipenv run black        types: [python]      - id: flake8        name: flake8        stages: [co妹妹it]        language: system        entry: pipenv run flake8        types: [python]        exclude: setup.py      - id: mypy        name: mypy        stages: [co妹妹it]        language: system        entry: pipenv run mypy        types: [python]        pass_filenames: false      - id: pytest        name: pytest        stages: [co妹妹it]        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 co妹妹it --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-co妹妹it and pre-push hookspipenv run pre-co妹妹it install -t pre-co妹妹it
pipenv run pre-co妹妹it install -t pre-push复制代码

模板名目蕴含一个十分简略的 Python 文件以及测试,能够试用下面这些对象。正在编写完代码感觉没成绩后,就能够执行第一次 git co妹妹it,一切的 hooks 都将运转。

集成到编纂器

尽管正在提交时晓得名目的代码始终放弃最高水准是件使人兴奋的事件。但若正在代码已全副修正实现之后(提交时),再发现有成绩仍是会让人很没有爽。以是,及时暴显露成绩要好患上多。

正在保留文件时,花一些工夫确保代码编纂器运转这些饬令。有实时的反馈,这象征着你能够正在代码另有印象的时分能迅速处理引入的任何小成绩。

我集体应用一些超卓的 Vim 插件来实现此义务:

  • ale 及时运转 flake8 并正在保留文件时运转 black、isort 以及 mypy
  • 与 projectionist 集成的 vim-test 正在文件保留上运转 pytest

欢送酷爱技巧以及开源的小同伴退出 HG 推出的译文亦舞系列的翻译中来,能够留言通知咱们。

更多相干收费学习保举:python视频教程

以上就是建设一个完满的Python名目的具体内容,更多请存眷资源魔其它相干文章!

标签: python教程 python编程 python使用问题 Python项目

抱歉,评论功能暂时关闭!