paint-brush
书评:Claudio Jolowicz 的超现代 Python 工具经过@usetech
617 讀數
617 讀數

书评:Claudio Jolowicz 的超现代 Python 工具

经过 Usetech 7m2023/09/28
Read on Terminal Reader

太長; 讀書

Claudio Jolowicz 的《Hypermodern Python Tooling》即将出版,计划于 2024 年 4 月发布,提供了 Python 开发工具的全面指南。它涵盖了以前分散在各个来源的主题,提供了有关安装 Python、管理环境、包、依赖项和测试的深入见解。本书介绍了 pipx 和 Poetry 等关键工具,重点关注 Python 生态系统中的实际用法和替代方案。虽然它内容丰富,但一些读者可能会发现它在某些地方有点令人困惑,并希望获得更多重要的示例。它还缺乏对某些主题的覆盖,例如 Windows 包管理器、在 Unix 上从源代码构建 Python、在 Docker 容器中运行 Python、在 Windows 上创建 .exe 文件、替代项目分发方法和 linter。尽管如此,还是建议寻求综合资源的 Python 爱好者使用它。
featured image - 书评:Claudio Jolowicz 的超现代 Python 工具
Usetech  HackerNoon profile picture
0-item



我有机会阅读了 Claudio Jolowicz 所著的《Hypermodern Python Tooling》的早期版本,该书将于 2024 年 4 月发布。我阅读了 2023 年 6 月的版本,由于我还没有找到书,所以有动力写一篇评论之前关于这个话题。


资料来源:O'Reilly Media, Inc.


本书中涵盖的主题以前仅在会议视频、技术文章和教程中提供,具体取决于谁更喜欢哪种类型的内容。在我看来,其他来源如果对这些问题有任何关注,那也是非常肤浅的。它通常最终会成为安装Python解释器本身的各种变体。


截至 2023 年 6 月,抢先体验图书分为 7 个部分:


  • 安装Python;
  • Python 环境;
  • Python 中的包;
  • 依赖管理;
  • 用诗追踪;
  • 使用 Pytest 进行测试;
  • 使用 Coverage.py 测量覆盖率


本书各部分概述

第一部分描述了 Python 版本控制的发布周期。它描述了不同操作系统的不同安装方法:Windows、 Linux 、macOS,使用 pyenv 安装许多版本的 Python 解释器,不仅基于 CPython,还包括 PyPy、IronPython、Jython、Pyston 等。给出了同样适用于 Unix 系统的使用 pylauncher 的示例。另外,还给出了使用 Anaconda 安装的示例。


第二部分讨论 Python 环境的组织方式:解释器、入口点脚本、模块(包括标准库和第三方模块)和共享库(包含从低级语言(如 C)编译的自定义代码)。提到了虚拟环境的使用,可以使用Python3中引入的内置venv模块创建虚拟环境,以及为不同操作系统启用虚拟环境的差异。引入了包管理器,既有内置的pip,也有第三方的pipx。给出了有关如何搜索模块的一般信息。


第三节介绍Python包索引。我们给出了一个简单脚本的示例,并展示了从创建项目到将其加载到测试包索引和实际包索引中的整个工作流程。 pyproject.toml 文件用于在构建应用程序包时指定元信息。现代且符合标准的项目管理器孵化 (https://hatch.pypa.io/latest/) 用作构建后端。 PyPI官方上传工具:Twine作为包上传工具。列出了软件包选项:sdists 和wheels。给出了项目的 pyproject.toml 文件中包含元信息的最重要字段的列表。


第四部分提出了可能是最模糊的问题:项目中的依赖管理问题。有两个选项:具有可能的变体和组合的requirements.txt,以及pyproject.toml。令人惊讶的是,这里不会有关于诗歌的故事,但它的描述不会花很长时间在第五部分。了解使用 pip-tools 工具生成所谓的依赖轨迹的工具的存在是非常有趣的。

第五部分涉及著名的诗歌,它为日常任务提供了自动化工具:依赖关系管理、创建包并将其发布在包索引中等。描述了与 pyproject 的差异。当我们熟悉其语法时,我们描述了 pyproject.toml 与前面章节中描述的差异。 Python 生态系统中还有诗歌的替代品,例如 hash 和 maturin。

第六部分描述了一个关于 Python 开发人员使用重构元素进行测试的简短 kmb(年轻战士课程),并提到了两个测试框架:unittest 和 pytest。这些是基础知识,但还提供了对该主题进行更详细描述的其他来源,以供深入研究。唯一没有提到的是鼻子,但在实践中,近年来 pytest 一直是事实上的领导者。在依赖约束的情况下,选择是显而易见的:unittest。给出了一个小型重构代码的示例,为未来的代码支持创建更灵活的基础并简化测试。


在第七节中,我们讨论使用标准跟踪模块以及第三方覆盖模块的测试覆盖率问题。但仍然建议使用第三方模块,可以在不同版本的Python解释器上运行,然后按照规则覆盖率运行→覆盖率组合→覆盖率报告得到代码覆盖率的合并报告。最终,每个人在项目的某个时刻都会面临一个困境:“为了测试,你需要重构代码;为了测试,你需要重构代码。”但未经测试就进行重构风险太大”。


在这里,一切很可能取决于项目本身、其范围、代码本身的质量以及测试的可用性。在我看来,你应该采取务实的方式,并且你不应该总是达到100%的参考,这通常不是必需的。最有可能的是,在阅读本文时,使用 Nox 工具自动化整个故事的章节尚未准备好。


总结之前,我们先安装pipx并尝试使用它。


PIPX 在行动

在官方网站上,该工具的开发者是这样定位的:

《概述:pipx 是什么?


pipx 是一个帮助您安装和运行用 Python 编写的最终用户应用程序的工具。它大致类似于 macOS 的brew、JavaScript 的npx 和Linux 的apt。


它与 pip 密切相关。事实上,它使用 pip,但专注于安装和管理可以直接作为应用程序从命令行运行的 Python 包。”


如果该软件包还附带CLI界面,那是个好消息,因为可以使用单个命令直接运行所需的软件包,而无需预先安装。你好,来自 NodeJS 世界的 npx 工具;)

在本地安装完 pipx 后,我们来运行 5 个小项目,看看它有多快速和简单。


  1. 用于从谷歌语音文本生成音频文件的实用程序


在控制台中,运行以下命令: $ pipx run google-speech -l en -o hello_world.mp3 "Hello, world!"


在这种情况下,将在执行命令的目录中创建文件 hello_world.mp3,并且可以使用媒体播放器收听该文件。



  1. 用于计算文件和目录校验和的实用程序 chksum-cli


在控制台中,运行以下命令: $ pipx run chksum-cli ./hello_world.mp3 b754e299a96327caaddd44b453f66ed9439c5d64d0d6e55c7e32471115757e5e sha256


无论文件的校验和是否匹配,都会显示结果。


  1. 通过 HTTP 协议发送请求的实用程序 httpy-cli


在控制台中,运行以下命令: $ pipx run httpy-cli mail.ru


将输出带有标头和请求正文的 HTTP 响应。



  1. 一个在控制台中显示伪图形时钟的实用程序,能够设置 timy-cli 计时器


在控制台中,运行以下命令: $ pipx run timy-cli -с


将显示一个模拟时钟,并且可以使用 CTRL + C 组合键停止它。



  1. 具有网络玩 cli-chess 可能性的控制台国际象棋游戏


在控制台中,运行以下命令: $ pipx run cli-chess


将启动用于选择游戏类型的菜单:




要查看其他选项,您可以将 --help 键添加到上面的命令中。


对书的印象


总的来说,这本书读起来很容易,但有些地方有点令人困惑。也许它缺少一些重要的例子。该书描述了一个从维基百科检索随机文章的示例脚本。


我喜欢什么:


就我个人而言,我发现了 pipx 工具(类似于 Node.js 世界中的 npx),当您需要快速熟悉某些东西并查看时,它非常方便。特别适合有 cli 界面运行的项目;


有趣的是了解到诗歌(https://python-poetry.org/)还有其他选择,例如hatch(https://hatch.pypa.io/latest/)和maturin(https://www.成熟蛋白.rs/);


对不同版本的 Python 解释器使用向后移植的示例;例如,importlib_metadata 用作 Python3.7 的向后移植,而不是 Python3.8 的 importlib.metadata。书中的示例代码:


try:

from importlib.metadata import metadata

except ImportError:

from importlib_metadata import metadata


我认为书中缺少的内容:


未涵盖的是使用包管理器在 Windows 系列操作系统上安装 Python 的选项,例如 Chocolatey (https://chocolatey.org/);


未涵盖从源代码为 Unix 发行版构建 Python 的方法;


无法在 Docker 容器中运行 Python。现在有很多构建,从基于 alpine 的最简约的构建开始;


没有考虑过如何让项目在Windows中运行可执行的.exe文件(在我的实践中就有这样的情况。是的,我同意这是一个非常小众的任务,但仍然如此);

没有替代项目分发的示例,例如,在 setuptools 和 dh-virtualenv 的帮助下使用标准包管理器 apt 进行类似 Debian 的分发,并形成 *.deb 包);


没有章节描述 pylint、flake8、isort、black、mypy、pyright 等短绒。


但这是我的主观意见,你可能不同意。

尽管这本书尚未形成最终版本(计划于 2024 年 4 月发布),但我可以将其推荐给任何对 Python 感兴趣的人。


作者: Daniil Nikitin,Usetech 高级软件开发人员