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

原文地址:How to set up a perfect Python project[1]
原文作者:Brendan Maginnis
译者:HelloGitHub-丫丫
校对者:HelloGitHub-削微寒

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

文章插图
 
当开始一个新的 Python 项目时,大家很容易一头扎进去就开始编码 。其实花一点时间选择优秀的库,整合进项目将为以后的开发节省大量时间,并带来更快乐的编码体验 。
在理想世界中,所有开发人员的关系是相互依赖和关联的(协作开发),代码要有完美的格式、没有低级的错误、并且测试覆盖了所有代码 。另外,所有这些将在每次提交时都可以得到保证 。(代码风格统一、类型检测、测试覆盖率高、自动检测)
在本文中,我将介绍如何建立一个可以做到这些点的项目 。您可以按照步骤操作,也可以直接跳到 使用 cookiecutter 生成项目 部分(老手) 。
首先,让我们创建一个新的项目目录:
mkdir best_practicescd best_practicespipx 安装 Python 三方库的命令行工具Pipx[2] 是一个可用于快速安装 Python 三方库的命令行工具 。我们将使用它来安装 pipenv 和 cookiecutter 。通过下面的命令安装 pipx:
python3 -m pip install --user pipxpython3 -m pipx ensurepath使用 pipenv 进行依赖管理
Pipenv[3] 为您的项目自动创建和管理 virtualenv(虚拟环境),并在安装/卸载软件包时从 Pipfile 添加/删除软件包 。它还会生成非常重要的 Pipfile.lock 用于保证依赖的可靠性 。
当你知道,你和你的队友正在使用相同的库版本时,这将会极大地提高编程的信心和乐趣 。Pipenv 很好地解决了使用相同的库,版本不同的这一问题,Pipenv 在过去的一段时间里获得了广泛的关注和认可,你可以放心使用 。安装命令如下:
pipx install pipenv使用 black 和 isort 进行代码格式化black[4] 可以格式化我们的代码:
Black 是毫不妥协的 Python 代码格式化库 。通过使用它,你将放弃手动调整代码格式的细节 。作为回报,Black 可以带来速度、确定性和避免调整 Python 代码风格的烦恼,从而有更多的精力和时间放在更重要的事情上 。
无论你正在阅读什么样的项目,用 black 格式化过的代码看起来都差不多 。一段时间后格式不再是问题,这样你就可以更专注于内容 。
【如何建立一个完美的 Python 项目】black 通过减少代码的差异性,使代码检查更快 。
而 isort[5] 是对我们的 imports 部分进行排序:
isort 为您导入的 Python 包部分(imports)进行排序,因此你不必再对 imports 进行手动排序 。它可以按字母顺序对导入进行排序,并自动将其拆分成多个部分 。
使用 pipenv 安装它,以便它们不会使部署混乱(可以指定只在开发环境安装):
pipenv install black isort --devBlack 和 isort 并不兼容的默认选项,因此我们将让 isort 遵循 black 的原则 。创建一个 setup.cfg 文件并添加以下配置:
[isort]multi_line_output=3include_trailing_comma=Trueforce_grid_wrap=0use_parentheses=Trueline_length=88我们可以使用以下命令运行这些工具:
pipenv run blackpipenv run isort使用 flake8 保证代码风格Flake8 确保代码遵循 PEP8 中定义的标准 Python 代码规范 。使用 pipenv 安装:
pipenv install flake8 --dev就像 isort 一样,它需要一些配置才能很好地与 black 配合使用 。将这些配置添加到 setup.cfg :
[flake8]ignore = E203, E266, E501, W503max-line-length = 88max-complexity = 18select = B,C,E,F,W,T4现在我们可以运行 flake8 了,命令:pipenv run flake8。
使用 mypy 进行静态类型检查
Mypy[6] 是 Python 的非强制的静态类型检查器,旨在结合动态(或 “鸭子”)类型和静态类型的优点 。Mypy 将 Python 的表达能力和便利性与功能强大的类型系统的编译时类型检查结合在一起,使用任何 Python VM 运行它们,基本上没有运行时开销 。
在 Python 中使用类型需要一点时间来适应,但是好处却是巨大的 。如下: