我有机会阅读了 Claudio Jolowicz 所著的《Hypermodern Python Tooling》的早期版本,该书将于 2024 年 4 月发布。我阅读了 2023 年 6 月的版本,由于我还没有找到书,所以有动力写一篇评论之前关于这个话题。
本书中涵盖的主题以前仅在会议视频、技术文章和教程中提供,具体取决于谁更喜欢哪种类型的内容。在我看来,其他来源如果对这些问题有任何关注,那也是非常肤浅的。它通常最终会成为安装Python解释器本身的各种变体。
截至 2023 年 6 月,抢先体验图书分为 7 个部分:
第一部分描述了 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 是一个帮助您安装和运行用 Python 编写的最终用户应用程序的工具。它大致类似于 macOS 的brew、JavaScript 的npx 和Linux 的apt。
它与 pip 密切相关。事实上,它使用 pip,但专注于安装和管理可以直接作为应用程序从命令行运行的 Python 包。”
如果该软件包还附带CLI界面,那是个好消息,因为可以使用单个命令直接运行所需的软件包,而无需预先安装。你好,来自 NodeJS 世界的 npx 工具;)
在本地安装完 pipx 后,我们来运行 5 个小项目,看看它有多快速和简单。
在控制台中,运行以下命令: $ pipx run google-speech -l en -o hello_world.mp3 "Hello, world!"
在这种情况下,将在执行命令的目录中创建文件 hello_world.mp3,并且可以使用媒体播放器收听该文件。
在控制台中,运行以下命令: $ pipx run chksum-cli ./hello_world.mp3 b754e299a96327caaddd44b453f66ed9439c5d64d0d6e55c7e32471115757e5e sha256
无论文件的校验和是否匹配,都会显示结果。
在控制台中,运行以下命令: $ pipx run httpy-cli mail.ru
将输出带有标头和请求正文的 HTTP 响应。
在控制台中,运行以下命令: $ pipx run timy-cli -с
将显示一个模拟时钟,并且可以使用 CTRL + C 组合键停止它。
在控制台中,运行以下命令: $ 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 高级软件开发人员