热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何完美的建立一个python项目

在本篇文章里小编给大家整理了关于如何完美的建立一个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 很好地解决了使用相同的库,版本不同的这一问题,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_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 一样,它需要一些配置才能很好地与 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,test
ignore_missing_imports=true

现在我们可以运行 mypy 了:

pipenv run mypy

这是一个有用的 备忘单 。

用 pytest 和 pytest-cov 进行测试

使用 pytest 编写测试非常容易,消除编写测试的阻力意味着可以快速的编写更多的测试!

pipenv install pytest pytest-cov --dev
这是 pytest 网站上的一个简单示例:
# content of test_sample.py
def inc(x):
    return x + 1
def 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) == 5
E       assert 4 == 5
E        +  where 4 = inc(3)
test_sample.py:6: AssertionError

我们所有的测试代码都放在 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-verify 或 git push --no-verify

使用 COOKIEcutter 生成项目

现在,我们已经知道了理想项目中包含了什么,我们可以将其转换为 模板 从而可以使用单个命令生成一个包含这些库和配置的新项目:

pipx run COOKIEcutter gh:sourcery-ai/python-best-practices-COOKIEcutter

填写项目名称和仓库名称,将为您生成新的项目。

要完成设置,请执行下列步骤:

# Enter project directory
cd 
# Initialise git repo
git init
# Install dependencies
pipenv install --dev
# Setup pre-commit and pre-push hooks
pipenv 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

到此这篇关于如何完美的建立一个python项目的文章就介绍到这了,更多相关建立一个完美的python项目内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文详细介绍了Vim编辑器中的三种模式(命令模式、末行模式和编辑模式)以及它们之间的操作区别和切换方法。Vim编辑器凭借其多种命令快捷键和高效率的操作方式,得到了广大厂商和用户的认可。对于想要高效操作文本的用户来说,了解这些模式的使用方法是必不可少的。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • 本文介绍了在Mac上配置环境变量,实现Python3的命令行调用的步骤。首先通过官网下载或使用brew安装Python3,并找到安装路径。然后将该路径添加到环境变量中,可以通过编辑.bash_profile文件或执行source命令来实现。配置完成后,即可在命令行中直接调用Python3。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
author-avatar
阿日小子很顽强_756
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有