网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

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

  当开始一个新的 Python 项目时,大家很容易一头扎进去就开始编码。其实花一点时间选择优秀的库,整合进项目将为以后的开发节省大量时间,并带来更快乐的编码体验。

  在理想世界中,所有开发人员的关系是相互依赖和关联的(协作开发),代码要有完美的格式、没有低级的错误、并且测试覆盖了所有代码。另外,所有这些将在每次提交时都可以得到保证。(代码风格统一、检测类型、测试覆盖率高、自动检测)

  在本文中,我将介绍如何建立一个可以做到这些点的项目。您可以按照步骤操作,也可以直接跳到使用 cookiecutter 生成项目部分(老手)。

  首先,让我们创建一个新的项目目录:

  mkdir best_practices
cd best_practicespipx 安装 Python 三方库的命令行工具

  Pipx[2] 是一个可用于快速安装 Python 三方库的命令行工具。我们将使用它来安装 pipenv 和 cookiecutter。通过下面的命令安装 pipx:

  python3 -m pip install --user pipx
python3 -m pipx ensurepath使用 pipenv 进行依赖管理

Pipenv[3] 为您的项目自动创建和管理 virtualenv(虚拟环境),并在安装/卸载软件包时从 Pipfile 添加/删除软件包。它还会生成非常重要的 Pipfile.lock 用于保证依赖的可靠性。

  当你知道,你和你的队友正在使用相同的库版本时,这将会极大地提高编程的信心和乐趣。Pipenv 很好地解决了使用相同的库,版本不同的这一问题,Pipenv 在过去的一段时间里获得了广泛的关注和认可,你可以放心使用。安装命令如下:

  pipx install pipenv使用 black 和 isort 进行代码格式化

  black[4] 可以格式化我们的代码:

Black 是毫不妥协的 Python 代码格式化库。通过使用它,你将放弃手动调整代码格式的细节。作为回报,Black 可以带来速度、确定性和避免调整 Python 代码风格的烦恼,从而有更多的精力和时间放在更重要的事情上。
无论你正在阅读什么样的项目,用 black 格式化过的代码看起来都差不多。一段时间后格式不再是问题,这样你就可以更专注于内容。
black 通过减少代码的差异性,使代码检查更快。

  而isort[5] 是对我们的 imports 部分进行排序:

isort 为您导入的 Python 包部分(imports)进行排序,因此你不必再对 imports 进行手动排序。它可以按字母顺序对导入进行排序,并自动将其拆分成多个部分。

  使用 pipenv 安装它,以便它们不会使部署混乱(可以指定只在开发环境安装):

  pipenv install black isort --dev

  Black 和 isort 并不兼容的默认选项,因此我们将让 isort 遵循 black 的原则。创建一个 setup.cfg 文件并添加以下配置:

  我们可以使用以下命令运行这些工具:

  pipenv run black
pipenv run isort使用 flake8 保证代码风格

  Flake8 确保代码遵循 PEP8 中定义的标准 Python 代码规范。使用 pipenv 安装:

  pipenv install flake8 --dev

  就像 isort 一样,它需要一些配置才能很好地与 black 配合使用。将这些配置添加到 setup.cfg :

  现在我们可以运行 flake8 了,命令:pipenv run flake8 。

  使用 mypy 进行静态类型检查

Mypy[6] 是 Python 的非强制的静态类型检查器,旨在结合动态(或 “鸭子”)类型和静态类型的优点。Mypy 将 Python 的表达能力和便利性与功能强大的类型系统的编译时类型检查结合在一起,使用任何 Python VM 运行它们,基本上没有运行时开销。

  在 Python 中使用类型需要一点时间来适应,但是好处却是巨大的。如下:

  1. 静态类型可以使程序更易于理解和维护
  2. 静态类型可以帮助您更早地发现错误,并减少测试和调试的时间
  3. 静态类型可以帮助您在代码投入生产之前发现难以发现的错误
pipenv install mypy --dev

  默认情况下,Mypy 将递归检查所有导入包的类型注释,当库不包含这些注释时,就会报错。我们需要将 mypy 配置为仅在我们的代码上运行,并忽略没有类型注释的导入错误。我们假设我们的代码位于以下配置的 best_practices 包中。将此添加到 setup.cfg :

  [mypy]
files=best_practices,test
ignore_missing_imports=true

  现在我们可以运行 mypy 了:

  pipenv run mypy

  这是一个有用的备忘单[7]

  用 pytest 和 pytest-cov 进行测试

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

  pipenv install pytest pytest-cov --dev

  这是 pytest 网站上的一个简单示例:

  要执行它:

  我们所有的测试代码都放在 test 目录中,因此请将此目录添加到 setup.cfg :

  [tool:pytest]
testpaths=test

  如果还想查看测试覆盖率。创建一个新文件 .coveragerc,指定只返回我们的项目代码的覆盖率统计信息。比如示例的 best_practices 项目,设置如下:

  现在,我们就可以运行测试并查看覆盖率了。

  pipenv run pytest --cov --cov-fail-under=100

  --cov-fail-under=100 是设定项目的测试覆盖率如果小于 100% 那将认定为失败。

  pre-commit 的 Git hooks

  Git hooks 可让您在想要提交或推送时随时运行脚本。这使我们能够在每次提交/推送时,自动运行所有检测和测试。pre-commit[9] 可轻松配置这些 hooks。

Git hook 脚本对于在提交代码审查之前,识别简单问题很有用。我们在每次提交时都将运行 hooks,以自动指出代码中的问题,例如缺少分号、尾随空白和调试语句。通过在 code review 之前指出这些问题,代码审查者可以专注于变更的代码内容,而不会浪费时间处理这些琐碎的样式问题。

  在这里,我们将上述所有工具配置为在提交 Python 代码改动时执行(git commit),然后仅在推送时运行 pytest coverage(因为测试要在最后一步)。创建一个新文件 .pre-commit-config.yaml,配置如下:

  如果需要跳过这些 hooks,可以运行 git commit --no-verify 或 git push --no-verify

  使用 cookiecutter 生成项目

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

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

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

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

  模板项目包含一个非常简单的 Python 文件和测试,可以试用上面这些工具。在编写完代码觉得没问题后,就可以执行第一次 git commit,所有的 hooks 都将运行。

  集成到编辑器

  虽然在提交时知道项目的代码始终保持最高水准是件令人兴奋的事情。但如果在代码已全部修改完成之后(提交时),再发现有问题还是会让人很不爽。所以,实时暴露出问题要好得多。

  在保存文件时,花一些时间确保代码编辑器运行这些命令。有及时的反馈,这意味着你可以在代码还有印象的时候能迅速解决引入的任何小问题。

  我个人使用一些出色的 Vim 插件来完成此任务:

  1. ale[11] 实时运行 flake8 并在保存文件时运行 black、isort 和 mypy
  2. projectionist 集成的[12]vim-test[13] 在文件保存上运行 pytest

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
为何女人一般不会拒绝男人提出啪啪的请求?

为何女人一般不会拒绝男人提出啪啪的请求?

桃小夭
2024-06-18 17:31:19
欧洲杯C组积分榜:塞尔维亚2轮1分命悬一线,斯洛文尼亚暂居第2

欧洲杯C组积分榜:塞尔维亚2轮1分命悬一线,斯洛文尼亚暂居第2

直播吧
2024-06-20 23:04:37
金正恩当面送大礼,一枚勋章两只狗,普京的回礼,出乎所有人意料

金正恩当面送大礼,一枚勋章两只狗,普京的回礼,出乎所有人意料

男女那点事儿儿
2024-06-20 22:09:27
中国富豪,移民数量曝光

中国富豪,移民数量曝光

说财猫
2024-06-20 10:58:43
乘客防晒躲路边遮阴,司机:取消订单,网友怒批:你傲慢的样子,真丑

乘客防晒躲路边遮阴,司机:取消订单,网友怒批:你傲慢的样子,真丑

小虎新车推荐员
2024-06-20 22:13:38
美记:鹈鹕想用英格拉姆去换申京 火箭根本不感兴趣

美记:鹈鹕想用英格拉姆去换申京 火箭根本不感兴趣

直播吧
2024-06-20 21:49:46
农村留守妇女的性生活到底有多尴尬?

农村留守妇女的性生活到底有多尴尬?

书画艺术收藏
2024-03-06 19:00:05
23岁那年,我爱上邻居阿姨,她真的很会拿捏我

23岁那年,我爱上邻居阿姨,她真的很会拿捏我

温酒与茶
2024-05-11 14:03:33
许国利被执行死刑,行刑前见了儿子最后一面,说出自己的杀妻真相

许国利被执行死刑,行刑前见了儿子最后一面,说出自己的杀妻真相

纸鸢奇谭
2024-06-19 23:55:54
打完《黑神话:悟空》第一关,纠结半天,我准备说点儿真话

打完《黑神话:悟空》第一关,纠结半天,我准备说点儿真话

游戏葡萄_
2024-06-19 16:08:36
中国队很可能成为2026年世界杯预选赛打比赛最多却没出线的球队!

中国队很可能成为2026年世界杯预选赛打比赛最多却没出线的球队!

刺头体育
2024-06-20 02:38:10
辽篮放手顶级后卫?京城争冠球队有戏,杨鸣或痛失3连冠功臣

辽篮放手顶级后卫?京城争冠球队有戏,杨鸣或痛失3连冠功臣

十点体坛
2024-06-20 21:52:27
一点也不想呆在中国了,出国的人已经排得人山人海到底是什么原因

一点也不想呆在中国了,出国的人已经排得人山人海到底是什么原因

寻梦小真
2024-04-29 22:17:36
明日夏至,中老年人最不能做的4件“损阳”事,年过50的人要知道

明日夏至,中老年人最不能做的4件“损阳”事,年过50的人要知道

神牛
2024-06-20 09:08:05
错放三千和错杀一个,怎么选?

错放三千和错杀一个,怎么选?

不死好鸟
2024-05-02 23:14:18
“儿媳,我家规矩是长辈睡主卧”“婆婆,我家外人与狗不得入内”

“儿媳,我家规矩是长辈睡主卧”“婆婆,我家外人与狗不得入内”

好笑娱乐君每一天
2024-06-20 07:50:02
惠特莫尔和杰伦布朗全面对比,谁弱谁强,一目了然!

惠特莫尔和杰伦布朗全面对比,谁弱谁强,一目了然!

刺头体育
2024-06-20 11:43:09
电影《三叉戟》网络首播!看完电影,我如鲠在喉,写下这篇影评

电影《三叉戟》网络首播!看完电影,我如鲠在喉,写下这篇影评

晴晴的娱乐日记
2024-06-19 23:19:45
狂轰73+10+7!历史第一,NBA最强得分王,要签史上最大顶薪合同

狂轰73+10+7!历史第一,NBA最强得分王,要签史上最大顶薪合同

康泳哥看体育
2024-06-20 23:23:05
云南用30多种酷刑摧残知青,造成上百人伤亡,叶剑英批示部队查办

云南用30多种酷刑摧残知青,造成上百人伤亡,叶剑英批示部队查办

拙言问史
2024-04-25 00:43:45
2024-06-21 04:34:44
HelloGitHub
HelloGitHub
带你玩GitHub开源社区
190文章数 5248关注度
往期回顾 全部

科技要闻

小米SU7流量泼天,富贵却被蔚来接住了

头条要闻

欧洲杯:凯恩破门 英格兰1-1丹麦

头条要闻

欧洲杯:凯恩破门 英格兰1-1丹麦

体育要闻

千夫所指的关系户 成了拯救葡萄牙的英雄

娱乐要闻

叶舒华参加柯震东生日聚会,五毒俱全

财经要闻

楼市新“王炸”!释放何信号?

汽车要闻

售价11.79-14.39万元 新一代哈弗H6正式上市

态度原创

房产
旅游
艺术
亲子
军事航空

房产要闻

海棠湾!一所重量级国际学校真的来了!

旅游要闻

铁路儿童票新规 已有超4900万小旅客免费出行

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

亲子要闻

夫妻俩趁孩子睡着后聊聊一天的琐事,这就是向往的婚姻吧?

军事要闻

以军发言人公开表示"哈马斯无法被消灭" 以政府反驳

无障碍浏览 进入关怀版