您好,欢迎收听 Python Bytes,我们将直接为您带来 Python 新闻和头条新闻。这是第 418 集,录制于 2025 年 1 月 27 日。我是 Michael Kennedy。我是 Brian Ocken。本期节目由……赞助播出。
我们,查看 Brian 的 pytest 课程,查看他的课程以及我在 Talk Python Training 上的许多课程,并感谢 Patreon 订阅者、订阅者和支持者,我们感谢你们所有人,即使你们什么也没做,我们也感谢你们的收听,这就是我们能够做这些事情的原因,你们想与我们联系吗?我们现在主要使用 Bluesky 和 Mastodon,链接在……
节目说明中。您可以加入我们的直播,pythonbytes.fm/live。你们中的一些人会来,大多数人不会,没关系。但如果您想加入,我们通常会在太平洋时间上午 10 点进行直播,有时事情会有点混乱。如果可用,请务必观看剧集页面上的视频回放。
最后,Brian 和我正在制作。Brian,我们正在继续磨练我们的Artisan Newsletter工艺。因此,如果人们想获得时事通讯,他们可以直接访问 Python Bytes FM,点击时事通讯。它是英雄图像中五个按钮的正中央。您只需提供您的姓名和电子邮件,我们就会向您发送摘要、见解、笑话,
以及我们现在正在做的一些不同的事情,Brian 试图将 TLDR 内容放在前面,以便您可以快速浏览它,以及笑话,以便人们可以从中获得乐趣。因此,如果他们想要,他们可以查看它。说到这里,今天你想先谈些什么?我实际上想谈论一些不太美好的事情,但我认为我们还是应该谈谈。所以上周末,我们失去了 Michael Foord……
你们中的许多人可能不知道他是谁,但他很有影响力。他是 Python 核心开发者,并且对 Python 和 PyCon 的早期发展影响很大,至少在我看来是这样。因此,他为人所知的一件事是,他是单元测试库的贡献者之一。
在 Python 中。然后他还编写了一个名为 mock 的包,它在一段时间内是独立的,但我认为在 3.3 或 3x 的早期版本中,它被合并到标准库中,作为 unittest.mock。因此,如果您正在模拟任何东西,即使您使用,pytest-mock 通常是我经常使用的,但它是围绕该库的包装器。
Michael 做了很多很棒的事情。他是一个性格鲜明的人。Guido 在 python.org 的讨论网站上发布了一篇悼念文章。Guido 提到的几件事是,Michael 是一位具有原创思想的人,他开启了在 PyCon 举办语言峰会的传统。这非常重要。而且,
如果我没记错的话,IRC 是,如果我没记错的话,他和 Barry Warsaw 一起做的。因此,他还编写了 mock 库,并在悼念文章中。因此,Guido 建议随意发布您与 Michael 相遇的积极回忆,
也许他的孩子(10 岁和 13 岁)长大后会读到这些回忆,这个帖子可能会帮助他们记住他们的父亲。我对此感到很难过,实际上。我最近家裡也有一些损失。我和 Michael 并不很亲近,但我有点希望我能更亲近一些。
我确实采访过他。我早些时候试图采访他,最终在 2021 年采访了他,在 Test & Code 播客上谈论了模拟。所以请听听这个。这是一个很棒的,再次强调,这是一个很棒的剧集。他对软件开发和测试有一些很好的建议。所以请查看一下。此外,Nicholas Tollervey 还写了一篇非常棒的文章。
我也曾在 Test & Code 播客上采访过他,也是一位很棒的人。他是 MU 编辑器的大佬。他写了一篇关于失去 Michael 的文章“我的朋友 Michael”,其中有一些很棒的照片。他是一个性格鲜明的人。这里有一段话我想读一下。
他是一个活生生的悖论,既对自己完全确信,却又总是质疑一切。他不回避激烈的独立思考,经常涉及最奇怪的话题,并通过最非凡的原创,我敢说很奇怪的论证路线。无论如何,再见,Michael,你会被怀念的。
是的,向整个社区、朋友和家人致以慰问。我没有机会见到 Michael,但看起来他确实很有影响力。是的。好吧,希望接下来你会有一些不那么令人沮丧的事情。是的。好吧,它以一张非常开心的图片开头,所以开头会很好。我邀请了来自 Six Feet Up 的 Calvin Hendrickson Parker 来参加 TalkPython,我们讨论了这个部署流程。
系统,有点像 cookie cutter,但远不止于此。一个最初用于 Django 应用程序的完整基础架构,但正在不断发展。无论如何,在此期间,我们讨论了这些工具和框架的许多构建块。这就是我们如何进入下一个主题。一个名为 Valkey 的东西。你还记得吗,我的意思是,你知道 Redis,对吧?Redis,键值存储,人们有时将其归类为数据库类别,用于
当您进行调查并使用哪个数据库时,Redis、JSON 或 SQL Server。就像,嗯,我想知道我应该选择哪个,哪些适合,哪些不适合等等。但是 Redis 是一种键值存储,主要是在内存缓存中,速度很快,但可以用于其他用途,例如队列。我相信它可以持久化。无论如何,它的许可证经历了一些奇怪的变化。顺便说一句,这并不是什么新鲜事,但这已经持续了一段时间了,我不知道。
我一直对 Redis 的人有刺痛的反应,但无论如何。我偶然发现了这个名为 Valkey 的东西,就像 value key,键值存储。Valkey 是一个真正的开源、无许可证、无成本、无任何其他内容的 Redis 替代方案。因此,一个开源内存数据存储。如果需要,它可以作为主要的数据库,但这并不是它的主要
主要目标。在这里,我只给你们第一段简短的内容。Valkey 是一个开源的高性能键值数据存储,它支持各种工作负载,例如缓存,主要是吧?消息队列,并且可以充当主要的数据库。Valkey 可以作为独立守护程序或集群运行,这非常棒,具有复制和高可用性选项。它甚至原生支持字符串,很明显,数字,可能,但哈希、列表、集合,所以你可以请求,可能像
我想查询这种字典类型的东西。很酷。如果去 GitHub 上某个地方,人们可以查看它。一定有 GitHub,对吧?我们开始吧。然后你进入存储库。
某个地方。哦,就在那里。终于找到了。18,000 个 GitHub 星星,700 个分支。所以它有很多生命力。让我们看看。它是否告诉你它有多老?我想大约一岁。无论如何,这很酷吗?我认为它真的很棒。是的,如果你去 GitHub 上某个地方,人们可以查看它。一定有 GitHub,对吧?我们开始吧。然后你进入存储库。
具有故障转移和复制功能,因为很多时候您必须重新启动这些东西。他们必须重新填充缓存,这可能会非常慢。而且,你知道,你会看到系统崩溃,它们无法完全恢复,因为缓存不存在,它们不断被杀死。无论如何,如果您需要这些技术,它们非常棒。Valkyrie,是的,请查看一下。酷。酷。好的,轮到你了。让我们看看。再次这样做。好的,有,
我要再次回到 Michael Foord,因为实际上在 2017 年,他写了一篇文章,名为《软件开发和测试的 30 个最佳实践》。而且……
我认为我没有在这个播客上谈论它,因为我的目的是在 Test & Code 上谈论它并采访 Michael。为什么我们没有谈论这个有很多原因。但我无法相信我们还没有讨论过这个。所以这是一篇非常棒的文章,30 个最佳实践——
我不会全部读出来,但我只想读几条。YAGNI,这并不是我听到 YAGNI 这个词的唯一地方,但 YAGNI 是第一条。YAGNI 代表 You Ain't Gonna Need It(你不需要它)。
所以不要编写您认为将来可能需要但现在不需要的代码。不要那样做。将来编写它,因为您可能不需要它。是的。人们对此非常紧张。就像,哦,我们必须为未来做计划。我们必须做到完美。或者只是拥抱重构。只是拥抱重构。对吧?就像现在编写它以使其工作。如果您需要更改它,有很多很棒的工具可以更改它。源代码控制不会破坏它。所以你可以保存它。重构工具。只需测试以确保它有效。是的。是的。
我要跳过一点。这里有很多很棒的东西。哦,我喜欢这个。在 API 设计方面,简单的事情应该很简单,复杂的事情应该是可能的。我不记得了。我不记得这是我从他那里得到的还是不是,但我遵循这个原则,努力让简单的事情保持简单。对于不简单的事情,它可能很复杂。没关系。第六条是单元测试、可测试性。
测试,单元测试测试行为单元,而不是实现单元。这些有点像战斗宣言。这几乎是经典测试驱动开发与 Marcus 测试驱动开发之间的区别。但我在这方面支持 Michael。
第八条,我们还有几条我想提一下。第八条,代码是敌人。它可能会出错。它需要维护。编写更少的代码。删除代码。不要编写不需要的代码。代码越少越好。确实如此。代码越少,错误就越少,大多数情况下,这是一个普遍的规则。
我想介绍的最后一条。顺便说一句,我也很关注第九条。哦,第九条?是的。不可避免地,代码注释会随着时间的推移而变成谎言。是的,绝对的。实际上,很少有人更新注释。我仍然记得我有一个代码库,其中有很多注释,并且有一些样板注释,为了理解代码,我……
我编写了一个脚本来将整个代码库复制到不同的目录结构中并删除所有注释。处理起来容易多了。我对帮助文档、帮助字符串、文档字符串有时也有这种感觉。是的,就像有 3 行代码和 18 行文档字符串一样。哇。如果这些不存在,我可以阅读它。是的。如果每个函数都是这样,那么这可能会使整个文件膨胀。您有几百行代码和 2000 行文件。无论如何。无论如何。
嗯,15,我们跳到 15。嗯,
您需要模拟的代码越多,您的代码就越糟糕。这是他让我感到惊讶的事情之一。这是编写 mock 库的人之一。他在我采访他的那一集中讨论的事情之一是,当他在一个团队中进行模拟测试、模拟测试隔离、测试驱动开发时,他正在开发这个。
他们遇到了我之前也遇到过的问题,那就是,如果您正在测试实现,这意味着当您必须重构代码时,
您的测试根本没有帮助。它们只是,它们只是全部中断。因此,测试行为更好。然后还要尽量避免模拟代码。这不是一个硬性规定。有时这是最简单的方法。是的。此外,如果你模拟它,你会伤害他的感情。这不好。我的意思是,有时你必须这样做,不好。来吧。是的,这很有趣。无论如何,这是一篇很棒的文章。去读一读吧。我已经在我的……
社交媒体上重新发布了它,很多人说,嘿,这很棒,太棒了,很好。
好的。我有一个问题要问你,Brian。好的。如果您正在处理一个 Web 项目,我一直在处理一些 Web 项目,并且您必须进行直接请求,例如,在 Python Bytes 上,如果我去查看最新的剧集,这非常接近于不真实,但我们的最新剧集是《Bugtied from the Light》,您可以看到这里有一张图片,这是 YouTube 的缩略图。我们有……
在 Python Bytes FM 中,当您加载此页面时,它会查找 YouTube 链接,然后它会与 YouTube 通信,提取
并获取缩略图。现在您可能会想,为什么不直接在那里嵌入 YouTube 视频呢?因为 Google 是寄生虫。当您嵌入 YouTube 视频时,它会将跟踪 Cookie 放到您身上,这意味着我们必须有一个 Cookie 横幅。您是否接受我们的 Cookie?因为我们正在通过跟踪您来改善我们的网站。我想,我敢肯定你不是,但好吧。或者您可以下载图像,将其放入数据库,然后从法院或 Flask 或 Pyramid 或……
或您正在使用的任何东西中提供服务,对吧?- 是的。- 当您执行此类操作时,您需要知道 MIME 类型或内容类型,更重要的是。例如,您需要告诉浏览器,这不仅仅是二进制内容,而是一张图像。我知道它来自数据库,它没有文件名,但它是 PNG 或 JPEG 或其他什么,对吧?
所以回到我的主题,mimetype.io,我更愿意称之为 contenttype.io。但是,你知道,例如,告诉我 JPEG 的内容类型是什么?好吧,它可能是 image/jpeg。但是里面有没有 E,像 JPEG 还是 JPG?但你最好不要弄错,对吧?
所以有一个网站 mimetype.io,您只需输入您可以想象的任何文件扩展名,它就会告诉您它是 image/jpeg,带 E,而不是不带 E。它会显示所有适用此扩展名的文件类型扩展名。如果还有其他名称,它还会显示其历史记录。有时我认为如果我将其放入 JSON 中,可能会有……
JSON 是 application/json,但有一个已弃用的 text/json。它也可能显示为,这很酷吗?是的。是的。因此,如果您正在处理 Web 项目并且需要发送文件,则需要指定内容类型。就是这样。
所以我真的很喜欢这个。我在 httpstatuses.io 上偶然发现了这个,它与 HTTP 状态代码的非常相似的项目有关。例如,您已经看到 200、201,例如 201 很好。如果您发布了新内容或其他什么,201 表示已创建。
203 是什么?我不知道,伙计。但是如果您点击它,它会说这是一个,让您可以深入研究它们。这是一个 203 非权威信息。此请求已成功,但包含的有效负载已由转换代理从原始服务器的 200 OK 响应修改。哇!但它还会向您展示如何在 Python 或新的 Python 等中将这些内容作为枚举获取。
对,所以您不是使用魔术数字,例如 203 或引号 203,有时这些是代表性字符串,我不知道为什么,但无论如何,我们将回到这一点来谈论我们的笑话,但重点是 mimetype.io,我希望它被称为 contenttype.io,但无论如何它仍然有效,我喜欢 MIME 类型,是的,就像困在气泡中的类型一样,我出不去,我知道,是的,它们确实会表现出来,它们确实会表现出来。
对不起。不,没关系。好的。这就是主要内容,对吧?是的,我认为是的。你有额外的内容吗?我注意到只有一个。我注意到今天有人在网上发布说 Python 1.1 发布了。实际上,截至今天,31 年前的 Python 1.1。1994 年 1 月 27 日,Guido 发布了 1.00。无论如何。我厌倦了解析你上周得到的 Perl 代码。
厌倦了 CGI。让我们开始吧。对 born shell 语法感到沮丧。是的。是的。是的。是的。是的。是的。有趣。酷。好吧,我不知道。我们将看看那件事是否会成功。希望如此。它有未来。是的,我们将拭目以待。好的。酷。我有一些额外内容。我会简短一些。我没有很多。
说到版本发布,Python 3.14.0 Alpha 4 上周发布,在我们录制上一集后几分钟。所以自上次以来,有一些事情要宣布。人们可以查看它。它正在进行中。这是 Alpha 4。这意味着还有三个 Alpha 版本。然后我们进入 Beta。然后您可以开始认真地将其视为一个已修复的项目,对吧?很有可能没有新功能,只有错误修复和改进,然后它才会发布。尽管我确定他们可能会决定。
你知道,这太粗糙了。我们不会做到的。我们将删除一个功能。但我们的想法是 Beta 版本是固定的。是的,实际上,所以我通常不会测试新内容,直到我们进入 Beta 版本。但是 UV 使加载……
预发布内容变得如此容易,以至于我已经在使用 3.14 进行测试了。太棒了。它不仅易于使用,而且影响也很小。这不像您接管了机器的最新 Python,现在是这个 Alpha 版本。是的,对。是的,是的。免费线程 Python 也一样,对吧?您可以使用 Ruby 获取它。很酷。是的。
好的。这甚至不会出现在这里,但后来我在设置时想到了它。我刚刚设置了一个 FastMail 帐户。哇,FastMail 比我最近一直在使用的 ProtonMail 好得多。就像 ProtonMail 总是很慢而且很笨拙,即使是归档之类的事情。就像他们有一个热键来归档您的邮件,您正在查看邮件,然后您按下归档。大约三秒钟后,它才会归档并消失。它在做什么?所以我将我的个人邮件切换到 FastMail,到目前为止,我强烈推荐它。
是的,我使用它已经有一段时间了。我喜欢它。你喜欢吗?是的,我也非常喜欢它。好的。好吧,这让我们想到了我们的笑话。好的。回到 HTTP 状态代码。Brian,是哪一集?我不记得了。418。418。好吧,让我们看看状态代码 418。在某个社交媒体上,Mastodon 或 Bluesky,我不记得了,我相信,有人说,它来了。它来了。你必须这样做。
他们是对的。他们是对的。他们给了我们一张图片。我再也找不到那篇文章了。所以对不起。我无法感谢他们,但感谢您发送它。httpstatuses.io/418,418。客户端错误,418。我是一个茶壶。这实际上在 HTTP 规范中。您可以根据其提供的任何值返回它。418,我是一个茶壶。任何试图用茶壶冲泡咖啡的尝试都应导致错误代码 418,我是一个茶壶。生成的实体主体可能又短又粗壮。
我对 Python 非常失望。我很失望。有一个 .NET 枚举,状态代码状态,状态 418,我是一个茶壶。有一个 Rust,我是一个茶壶。有一个 Go,状态茶壶。没有 Python,我是一个茶壶。他们没有实现所有状态代码。来吧,伙计们。哦,天哪。这可能是我第一个 PEP,对吧?是的,我认为你应该这样做作为一个 PEP。我必须让它被接受。是的,所以……
所以,第一,它很有趣,但你认为它只是为了让人们调试他们的状态代码而存在吗?是的,可能。我敢肯定这是一个愚人节笑话,它进入了规范,人们说,我们正在做。是的,我们只需要保留它。我是一个茶壶。这是一个完美的状态代码。是的。
所以这是“我是一个茶壶”剧集。我的意思是,节目标题就在那里。你怎么看?是的,绝对的。第 418 集,我是一个茶壶。让我们开始吧。希望 RSS 阅读器仍然可以获取它。我知道。他们会在 RSS 上读取 200 OK 还是读取标题?418,我是一个茶壶。我们将拭目以待。对不起,您的播客信件并不短也不粗壮。是的,我希望如此。不,我希望它真的有效。是的。
太棒了。我们将看看它会走向何方。但制作这 418 集节目非常有趣。感谢您的收听。是的,谢谢。是的,感谢所有收听节目的听众。再见。再见。