We're sunsetting PodQuest on 2025-07-28. Thank you for your support!
Export Podcast Subscriptions
cover of episode #407 Back to the future, destination 3.14

#407 Back to the future, destination 3.14

2024/10/28
logo of podcast Python Bytes

Python Bytes

AI Deep Dive AI Chapters Transcript
People
B
Brian
Python 开发者和播客主持人,专注于测试和软件开发教育。
M
Michael
帮助医生和高收入专业人士管理财务的金融教育者和播客主持人。
Topics
Michael 详细介绍了 Python 3.14.0 alpha 1 的新特性,包括延迟求值注解 (PEP 649)、改进的错误信息以及对 async IO、Pathlib 等模块的优化。他强调了这些改进对性能和开发效率的提升,并特别提到了 Pathlib 模块新增的递归复制和移动文件和目录的功能。他还介绍了其他一些值得关注的更新,例如 HTTP 服务器的暗黑模式支持。 Brian 介绍了 UV 工具对依赖项分组 (PEP 735) 的支持,并演示了如何使用 `uv add --group` 添加依赖项到指定分组,以及如何使用 `uv sync --group` 安装分组依赖项。他解释了 `uv pip install --group` 目前尚不支持的原因,并指出了使用 `uv sync` 安装依赖项的流程。他还讨论了依赖项分组在不同场景下的应用,例如在 CI 系统中构建文档或进行静态代码分析时,可以只安装必要的依赖项,从而提高效率。

Deep Dive

Chapters
Python 3.14 alpha 1 is out with several new features, including deferred evaluation of annotations (PEP 649), improved error messages, and various updates to modules like Pathlib and AsyncIO. Performance improvements and a dark mode for the `http.server` are also included.
  • Python 3.14 alpha 1 released
  • PEP 649 (Deferred Evaluation of Annotations)
  • Improved error messages
  • Pathlib enhancements (recursive copy/move)
  • AsyncIO performance improvements (10%)

Shownotes Transcript

您好,欢迎收听 Python Bytes,我们将直接为您带来 Python 新闻和头条新闻。这是第 407 集,录制于 2024 年 10 月 28 日。我是 Brian Ocken。我是 Michael Kennedy。本周的赞助商是我们自己。因此,请查看我们的产品。TalkPythonTraining.com 上有所有精彩的课程。

然后在 PythonTest.com 上,我们有完整的 PyTest 课程以及简短的课程 Hello PyTest。还要感谢我们的 Patreon 支持者,我们对他们的感谢还不够,但非常感谢你们。我们非常感谢。如果您想与节目联系,我们很乐意听到您的声音。您可以在 Fostedon 上与我们联系。我们在 Fostedon 上的地址是 mkedney、Brian Ocken 和 Python Bytes。

这些链接也在节目说明中,以及在 PythonBytes.fm 上。您可以了解下一集节目的录制时间。我本来打算稍后再提这件事,我现在就提一下。下周 11 月 4 日,我们将提前录制。因此,时间将是早上 7:30 而不是我们通常的时间。那是太平洋时间,而不是我们通常的上午 10 点太平洋时间。

因为我的工作。无论如何,这就是下周的情况。但在 PythonBytes.fm 上,您可以注册我们的时事通讯,您可以获得节目说明,您可以注册并查看下一次直播录制的日期。但现在,我想听听 Michael 的想法,看看你想谈些什么。- 我们要瞬间移动到未来吗?- 是的。- Brian,我想让你想象一下,时间不再阴沉多雨。

大约 11 个月后,我们将迎来一个新的 Python 版本 3.14,而这个未来现在就可以在一定程度上实现,因为 3.14 alpha 1 现已可用,这是 Python 的 pi 版本,没错,所以……

这是第一个 Alpha 1 版本。理论上,至少按照计划,将会有七个版本,除非出现问题。这是在进入测试版、候选版本然后最终发布之前的七个 Alpha 版本中的第一个。所以它有……

它有一些新想法,但并非所有新想法。它带来了性能改进,实际上还有更多改进,这非常有趣。因此,如果您阅读博客文章公告,好吧,看起来,好的,我们有这个名为“延迟求值注释”的新 PEP。现在,我认为这本应在 3.11 或 3.12 中实现,诸如此类。所有认为,

类型应该很重要。像 Fast API 一样。是的,还有 Typer 和 Pydantic 等等。我将自己算作所有这些库的忠实粉丝。

所有这些人都在说,嘿,等等。这不仅仅是 MyPy 的事情。这些类型不仅仅是为 MyPy 而设计的。如果您取消它们的求值,我们所有很棒的框架都会消失。我认为这对 Python 来说将是巨大的倒退。许多人都同意,并进行了一些更改。因此,至少在有限的程度上,这并没有完成。但是,使用这些类型注释确实会带来性能成本,例如导入的潜在成本。它确实……

存在您想讨论的间接或某种半定义类型的奇怪问题。我有一个函数或类上的方法,我想说它返回这些类中的一个,或者,你知道,它就像一个等于。它采用这些类中的另一个,并告诉您它是否等于它。

因此,您必须使用诸如 typing.self 之类的奇怪技巧,或者您可以引用尚未定义的类型的名称,但是如果您最终找到它,总有一天它会被定义。因此,这将使您不必担心这些类型的事情。如果您使用它们,则有一个新的 API。如果您是 Pydantic 或 FastAPI 或其他什么,有一种新的方法可以说明……

让我读取有关此注释的元数据。这略有不同,但它仍然存在。改进的错误消息。我们都喜欢改进进一步改进的错误消息。就是这样。然后,所以当你阅读它时,听起来就像,好吧,这就是重点。但实际上,如果您去查看,链接在哪里?发行说明在这里的某个地方。因此,您单击此处,然后

为什么会有发行说明?做,做,做,做,做,做,做,做。真的吗?它去哪儿了?也许我没有注意到。但无论如何,Brian,有很多变化,从那里有很多变化。我认为。哦,我知道它在哪里。他们不称之为发行说明。以下是操作方法。

您单击 PEP,然后向下滚动,直到越过 PEP,它只是包含其他更改。所以,是的。因此,如果您访问这两个链接中的任何一个,它都会告诉您有关其消息的信息,告诉您有关 PEP 的信息,但是如果您查看滚动条,下面还有很多内容。例如,不正确的使用。是的,我认为这实际上是新闻,而不是被指出的内容。不正确地使用 await 和

异步推导现在已被检测到。我不知道你以前可能做错了什么,但是如果你做错了,我想,无论如何,如果你做错了。好吧,显然,就像,assert await one。是的,我认为问题是,您可能等待一个可能不可等待的事物,可能在列表推导中。所以现在你会得到一个警告。是警告还是错误?语法错误。是的,语法错误。

但是您可以禁用语法错误,因为显然它以前有效。如果您只想继续这样做,那就没问题。让我们看看。一些关于 dunder debug 的内容。数值现在具有 float.from_number 和 complex.from_number,它们转换为浮点类型或复数类型,这……

有点意思。所以问题是,这不是一个解析操作。它采用一个数字并进行转换。如果您给它一个字符串,它将是一个错误。所以这就像,我只想确保我始终使用数字并以更有效的方式转换它们。哦,比强制转换好。是的。是的。强制转换在哪里……强制转换……

一种类型注释类型的处理,而这是一种真正的转换,对吧?不错。因此,我们获得了新的注释库,它讨论了为 PEP 749(延迟类型注释)提供的那些功能。ArgPars 获得了一些更新。AST、并发功能、C 类型、十进制、日期时间、磁盘、分数、函数、HTTP。这很有趣。你知道,HTTP,这是一件好事。你可以说 Python -M HTTP -

服务器,我认为是这样的,所以如果你只有一个目录,并且你像我需要将其作为 Web 视图一样,例如,如果你有一个 HTML 文件,并且它说我想打开正斜杠一些 CSS 文件或正斜杠一些 JavaScript 文件或类似的东西

如果您只是打开它,它会说,我不知道这些文件是什么,对吧?但是如果这个 Web 服务器要提供服务,它很容易工作。因此,您可以只键入 Python-M space acp.server,回车,它将打开一个小型的 Web,就像一个无操作 Web 服务器,然后您可以实际与这些内容进行交互。所以现在它有暗模式。哦,你应该先说这个,伙计。这很酷。是的。

是的,这是 Yorick Henson 贡献的,我认为,好吧,Yorick 一定是暗模式的忠实粉丝,想要……就像我一样,是的。很好,好的。JSON 获得了一些更新。OperatorOps、Pathlib。Pathlib,实际上,Pathlib 的更改很有趣。我正在浏览此列表以指出,例如,仅在此 Alpha 1 版本中就进行了许多更改。但是 Pathlib 现在有……

添加方法,例如 Pathlib 的新功能,用于递归复制和移动文件和目录。哦,是的。我支持这个。复制。复制是文件或目录树到目标位置。复制到。复制到目标目录中。移动然后移动到。太棒了。这很好。所以 Barney Gale 做到了。谢谢。PDB、Pickle、Pydoc、SimTable、Sys 和 Unit Test。它没有死。不,它没有。

无论如何,还有优化。例如,async IO 现在使用双向链表实现来实现。对于本机任务,向计算机科学数据结构级别致敬,这将标准高性能基准测试的执行速度提高了 10%,并减少了内存使用量。那么谁不想要呢?这听起来很棒。

没错。还有更多。您可以阅读相关信息。我只是提到了它。就像我说的每一件事都有一个段落或项目符号列表,如果您愿意,您可以深入了解。就是这样。现在,回到未来。回到现在。随便。回到现在的时间。是的。或快速时间。所以就在上周 10 月 21 日,第 406 集,我们谈到了……

我们谈论了很多事情,但其中一件事情是 PEP 735,它在 PyProject.toml 中使用依赖项组。我不知道我们什么时候可以玩它们。答案是现在,因为 UV 立即决定这样做。因此,UV 只需在 2021 年进行更改。

在 0.4.27 版本中,在更改日志中,他们说支持依赖项组,这非常酷。甚至还支持 PEP 735。我简直不敢相信这么快。这就像在我们谈论它几天后。他们一定在听播客。这太棒了。是的,可能吧。这就像,哦,是的,三天前。它被合并了。所以这很酷。所以有很多添加的内容。

所以我开始玩它。因此,--group 已添加到 uv add 和 uv remove。因此,当您添加或删除依赖项时,您可以说 group,它会将它们放入组中。--dev 之类的东西。有一些这样的东西。因此,--dev 用于成为额外的依赖项。现在它是一个名为 dev 的依赖项组,并且……

因此,--dev 等同于说 --group dev。如果文档已更新,则在文档列表中会更清晰。因此,有一些地方没有完全更新。因此,有很多,添加依赖项到依赖项组的方法非常清楚,现在可以使用 UV。您可以说 uvadd 或

或 UV remove,效果很好。但是您如何安装它们呢?所以我尝试玩它。因此,默认组的文档也已更新。因此,您可以点击 UV 周围。讨论默认组和依赖项组。在这里,我们有像 dev for PyTest 一样的东西。当然,您的 dev 依赖项中会有 PyTest。文档中有一个小提示

--dev 标志。好的。所以我想,好的,那么我该如何安装东西呢?所以我期望我期望能工作的是说 UV pip install --group dev 并能够只安装这些而不安装项目。好吧,这还不工作。因此,Hinnick 提交了一个问题,并且

这个。这应该有效,但它无效。Pip install group。但问题是他们希望与 pip 的接口具有相同的兼容性。因此,他们只是在等待 PyPA 定义该接口是什么。这是公平的。所以我们有所有这些依赖项,你无法安装东西,对吧?不,不完全是。所以我还在 LinkedIn 上询问是否有人知道

Tushar 回复说,嘿,文档,他们没有,但它说 UV sync group 将有效。所以我查看了文档,但我找不到它。sync 没有谈论组,但它确实有效。我试过了。你可以,所以你,

本质上,这是有效的。那么你做什么呢?你创建,你有一个,你说你添加了一个依赖项组,然后你可以说 uvsync。如果您添加了组,例如 --group,然后是组名,您可以添加很多这样的组,那么您的

虚拟环境将同步以匹配您的项目所说的内容。基本上,这就是您可以安装的方式。您可以使用 sync 来安装您的东西。冗长,但这就是您可以做到这一点的方式。不错。哦,太棒了。无论如何。是的。因此,这允许您说,与 requirements.dev 不同,它允许您说,这里是我需要为项目上的特定操作或任务集的单独一组依赖项。它不一定会引入基本依赖项,对吧?这是主要区别。是的。

好吧,这就是想法,但对于 UV 来说,情况有所不同。因此,对于当前使用 sync 的 UV 来说,它将引入您的基本依赖项和额外依赖项。您还不能只使用该组。明白了,因为它还没有定义。关于如何说明这一点还没有达成一致。对。但是语法在那里,所以你可以玩语法。它非常舒适。实际上,很少……

像我一样,我不介意这样做,必须安装项目然后安装依赖项。但是,有时您只想安装一个组,例如构建文档或类似的东西。是的,我也没问题。你知道,一个可能

大多数人不会猜到的,但在 ML 领域,其中一些依赖项非常庞大。例如,如果您想使用 Spacey 的大型英语模型,您可以将其指定为,您可以将其指定为依赖项。您不使用 Python,也许您将其作为 Python 调用运行。无论如何,那东西大约有 500 兆字节或类似大小。好吧。所以你可能只想

不要也下载并安装它。对,特别是如果您有像模块化 CI 系统一样的东西,其中一个构建阶段是像构建文档或 linting、静态 linting 或类似的东西。您可能不想只为了执行其中一个阶段而引入整个世界。是的,这是一个很好的案例。好的,让我们深入了解下一件事。好的。Dive 来自我们不知情地了解的 Mike Fiedler。让我们看看。是的,Mike Fiedler。所以他……

在一个我正在查看的组讨论中提到了这一点。我不知道他是否专门为我们发送了它,但它在这里。我正在使用它,因为它是一个很酷的想法。所以事情是这样的。如果您有某种容器系统,例如 Docker 镜像,您

有很多步骤。当您应用时,创建容器的方式是转到 Dockerfile 并输入诸如执行此操作、然后此操作、然后此操作之类的行。它们可以是,通常是一些 Linux 命令,或者您可能会复制这些文件或在复制正确的内容后运行此 Python 命令。因此它们可能很大,例如 apt install 此事,但此事有 20 个依赖项或

或者您可能正在运行安装开发需求或您不需要的编译器。因此,您最终可能会遇到构建缓慢且镜像较大的问题。你该如何解决这个问题?您在其上运行此 dive 东西。所以这个东西很酷。所以它所做的是,如果您访问 GitHub 页面,则可以在这里有一个小的动画图形。对于任何 UI,请注意,动画 GIF 会很棒,不是吗?无论如何,你可以在这里有这个。

其想法是它基本上允许您查看每一层。因此,您运行的每一行代码,例如创建一个目录、复制这些文件、UV pip install、-R requirements 或类似的东西。您单击的每一行都会为您提供所有文件,例如您可以使用目录文件大小浏览的树。

镜像,生成的镜像,然后还有一个增量。因此,当您单击周围时,它会说在这一步添加了这些文件,更改了这些文件,删除了这些文件。因此您可以看到,这就是此文件在此处的原因,因为在第 4 行,我们运行了此命令,该命令添加了这些文件。为什么是这样?

哦,这很酷。不是吗,对吧?是的。因此,如果您要四处发送容器,发送镜像,例如将其推送到 Docker Hub 然后将其拉到其他地方,那么您绝对应该查看此内容。这并不是我可能关心的问题,因为我只是在服务器上构建我的容器然后使用它们,这也是一种方法。但是如果您四处发送它们并且关心它们的大小或构建速度缓慢或其他任何问题,那么这太棒了。查看一下。

还有一些安全问题,以确保不会添加您不知道的内容。对。甚至只是,我想确保这里没有编译器,因为如果有人闯入容器并且他们可以使用编译器,那么他们可以说,上传一些 C++ 代码,编译它并运行它。是的。对。

你知道,所谓的“利用现有资源”类型的问题,在有人闯入某物之后。因此,您只需说 dive space 您的镜像,或者您可以将其别名为,这是一个,这是一个非常好的方法。因此,如果我已经在具有 Docker 的系统上,我开始对某些工具执行此操作。因此,您可以使用 glances 执行此操作,您可以使用 dive 执行此操作,您可以使用其他方法执行此操作,一种方法是,我可以将 dive brew 安装到我的 Mac 上,但是然后

谁知道这对我的电脑做了什么?我正在运行来自互联网的任意代码。我可能相信它,但你知道,呃。

对吧?所以您可以做的是,您可以创建别名,然后您可以将 dive 设置为要运行的 Docker 命令序列。因此,即使 dive 本身也在 Docker 中运行,然后它会与您指向的其他 Docker 容器进行通信,就是这样,这是一个越来越流行的非常好的模式。这是 Docker 递归。一直都是 Docker。但是是的,您只需创建一个别名,然后它就是 Docker run -it,删除镜像,映射它需要的卷,然后它就开始了。是的。

是的,这真的很酷。好的,还有什么?我会很快总结一下。因此,它将显示按层分解的镜像,就像我说的那样。发生了什么变化?它有一个指标,就像循环复杂度等效项,但对于 Docker 来说,我相信他们编造了这个。估计的镜像效率。底层窗格显示了一个实验性指标,它将猜测您的镜像包含多少浪费的空间。这有点意思。您可以进行快速构建分析。

快速构建测试,因此无需构建该内容然后运行 dive,您可以说 dive build,它实际上将构建该内容然后立即对其进行测试,因此它就像一行,然后还有 CI 集成,用于在 CI 中执行某些操作以及您可以使其在失败某些指标时使 CI 失败的方式等等

哦,这很酷。是的,Pat Decker 在那里说,我已经使用 Dive 一段时间了。不错。很高兴听到证词。所以,是的,人们可以查看我们。显然,它是开源的,用 Go 编写的,有 46,000 个 GitHub 星星。所以它非常有名并且被广泛使用。这很好。我还喜欢 CI 集成,因为如果我无法从命令行获得该功能,则该功能不存在。这是我的担忧。

无论如何,很酷。不错。我有一些,我想,一个小小的爆炸。我们谈到了未来。让我们稍微谈谈过去。我有一个问题。我已经有一段时间没有谈论 PyTest 元数据了,但是上周我有一个问题。有人联系我说,嘿,我已经有了这些 PyTest CI 系统。我想从测试环境向 PyTest 发送一些额外的数据

到报告服务器。有没有办法获取 PyTest 中的元数据,例如额外的元数据,将其添加到结果中,然后将其放在结果系统中的其他位置?我说,好吧,你查看过名为 PyTest Metadata 的插件吗?它正是这样做的。

所以我想提醒大家,PyTest 元数据是一个非常酷的插件。它完全按照您认为它会做的那样做。它将元数据与您的结果捆绑在一起,或者至少这正是我认为它会做的事情。它不是在测试您的元数据。它是在向结果添加元数据。因此,它一开始就做的一些事情,这很有趣,就是它自动填充了四个,我数对了吗?是的,四个不同的键。它是元数据的键值对。

它执行 Python 版本、平台。因此,Python 版本就像,你知道,任何 Python 版本。平台是从 Python 获取的字符串,用于说明某种类型的,你知道,对于 Mac OS 来说,它是 Darwin 或其他东西。然后是包,它列出了所有存在的 PyTest 包。然后……

实际上,它说明了 PyTest 包的描述。我认为是……我必须检查一下。我不确定它是否是所有可用的包,还是仅与之相关的包。是的,名称是 PyTest,但示例列出的内容超过 PyTest。是的,所以我不确定。但是然后有插件,它列出了您捆绑的所有 PyTest 插件,但是

我并没有真正为此使用它。我的意思是,这很有趣,但我确实添加了一些东西。所以我们有像我的,我通常是我正在测试的目标环境。那是什么版本?该版本上还有哪些额外的包?所以如果我正在测试,你知道,嵌入式系统,所以我正在检查我正在测试的系统的信息并将该信息频繁地添加到元数据中,但您可以做任何您想做的事情。但是这个,

但是这个添加很酷,而且很容易做到。您可以在期间添加它,您甚至可以在开始时添加它,例如在命令行上,如果您在命令行上知道它。但在测试中,您也可以在夹具或测试中添加它。您可以添加元数据。如果您执行 --verbose,则会在命令行中报告它,或者 -B 将添加像报告所有元数据一样的内容。但它也出现在 JUnit XML 中。并且一个

许多 JSON 结果和其他插件也将提取此元数据,因为它是一个非常广泛使用的插件。因此,如果您想将其传递,则非常有用。我相信它是专门为 PyTest HTML 插件生成的,因为贡献者相同,Dave Hunt 和其他人。但是……

但是,呃,元数据即使没有 HTML,呃,在我们的顶级 pie 测试插件列表中也被使用。呃,元数据排名第五,HTML 排名第六。所以它们都很流行,但是,呃,元数据本身也很流行。所以是的,非常酷。我喜欢它。无论如何,这是一个好主意。所以这就是,这些是我们的项目。呃,

我有一些额外的项目或一个额外的项目。你有什么额外的项目吗?击中它们。好的。是的,我有一些,但它们也很快。从这里开始是有意义的,因为我确实对插件列表做了一些更改。就在几天前,我正在查看 PyTorch

pythontest.com 上的顶级 PyTest 插件列表,并注意到其中有一些我不喜欢谈论的内容,因为它们已弃用,甚至开发人员也不希望您使用它们。所以我开始过滤这些内容。我将浏览列表并查看是否有已弃用的内容

因为如果您想找出我正在提取哪些内容的列表,您已经可以找到此信息。但是你为什么要这样做呢?我们想知道我应该查看的顶级 PyTest 插件。如果有你不应该使用的插件。

是的,这些内容即将推出。然后我想,你知道,我一直想在 Testing Code 播客上做一个新的系列。然后我想,为什么不看看这些插件呢?我不会浏览整个列表。此外,它每个月都会发生一些变化。但是我将浏览其中一些内容,并提取我认为人们应该了解的内容。所以我将做一个关于插件的系列节目。是的。

Max,我会出现的。你呢?有什么额外的吗?呃,

- 一些。让我们看看我们有什么。所以让我们从这里开始。Hugo Van Camande 说:“猜猜看?Pillow”,你知道,Python 图像库 11.0.0 发布了,它不仅支持 Python 3.13,还支持自由线程的 Python 轮子。- 哦,不错。- 所以我们正在进行大量的图像处理,并且您想加快速度,您运行的自由线程 Python T 或任何东西都很好。删除对 3.8 的支持,因为这太老了。删除了很多东西。

然后添加了许多内容。因此,如果您在这里查看,我相信,您会查看其中的所有更改。因此,这里发生了多少变化真是太棒了。因此,如果您使用 Python 处理图像,请使用 Pillow,有一个新的版本是一个重要的版本。但是如果您想,我可以用 Python 做什么图像处理?好吧,查看 Pillow。它做了很多事情。所以这很酷。我们有……

你知道吗,你听说过 pip install anti-gravity。你听说过 pip install 这个,或者抱歉,import this 和 import anti-gravity。但是 pip install Deutschland 呢?那会做什么?嗯。

所以这来自 Grand Knapp。它说,你好,Michael 和 Brian。这是给你们 14% 在德国的听众的推荐。我记得我之前谈到过这个。这是 Imami 一段时间前的分析数据。它说,只需 pip install Deutschland 即可获得大量有用的德国数据集,定期更新。所以你到这里,它有诸如,你想去……

查找地址、障碍线、建筑区域、建筑边界,我想,等等。我的德语建筑术语不太好。但无论如何,就是这样,对吧?你基本上,它只是拥有你可能想知道的关于德国所有这些不同组件或事物的数据,这很酷。是的,这很酷。远不止建筑物。那里有很多东西,不是吗?是的,是的。地址……

历史点,地下设施。它有高速公路信息。是的。是的。我们需要为许多国家/地区安装 pip,例如 pip install USA。它会唱一点 USA,USA,然后安装它。好吧。美国,美国,美国有董事会。好的。另一个有趣的大事是,我刚刚发布了一个谈话播客。

Python 博客。所以我个人有博客,TalkPython 上也有大量的 RSS,例如播客等等,正如你所料。但是一个专门的博客,这样我就可以发布我计划从事且与 TalkPython 相关的有趣的事情和系列,而不仅仅是我的个人博客。无论如何,它已经有了一些帖子,是的,Brian,我试图在这里采用超级干净、超级易读的版本。所以尽量不要。这很好。是的,谢谢。所以这是构建的。是的,继续。它是

继续。我本来想问你它是用什么构建的。嗯,它是用 Hugo 构建的,这是一个很棒的静态站点构建器。但有趣的是,它托管在 talkpython.fm/blog 下,而不是像 blog.talkpython.fm。我使用 Nginx 将不同的子 URL 指向不同的部分。就像大多数 TalkPython 都是 PyTorch,

显然是 Python 应用程序。但是这一部分是 Hugo,它们只是在相同的 URL 结构下共存,这很有趣。好的,不错。是的,我以后可能会写一篇关于这个的文章。是的,它是用 Hugo 构建的。就像我们自己的东西一样,对吧?我们自己的私人物品。是的,我只是吃了一些 Hugo。我遇到了一些 Hugo 问题,但是……你吗?嗯,我仍然喜欢 Hugo,所以没关系。好吧……

把它平衡一下。好吧。我有一个笑话要告诉你,但我找不到,这是一个我看到的漫画,但我再也找不到它了。我以为我在书签中将其添加到了我们的书签中,并且它的标题在那里,但它的 URL 不在那里。它只说狗笑话。我想,嗯?想知道,

在哪里。我试图搜索它,但我找不到它。但我可以告诉你笑话,好吗?好的。你准备好了吗?是的。想象一下,想象一下,一个小女孩刚刚得到她的第一只小狗。爸爸把它带回家了,他们正在后院……

他正要与女儿分享一些明智的建议,以帮助她习惯于养小狗以及所有新的责任等等,对吧?是的。所以她只是高兴地抚摸着新的小狗,并说,现在他们正在想一个名字,对吧?他说,现在,亲爱的,你需要仔细考虑这只小狗的名字,因为

因为你将不得不记住它一生,并在每个有愚蠢安全问题的网页上输入它。是的。所以这是爸爸的建议。记住你第一只宠物的名字,因为你将不得不记住它一生。是的。这是一个笑话。很好。没有图片,因为我找不到。我有一个狗笑话。所以让我们再加一个笑话。让我们来做吧。好的。

所以有点像狗笑话。所以一个人走进图书馆,他正在找一本书,他,他走到……图书管理员说,说我正在寻找一本特别的书,但我记不起它的名字了。它是一本,一本,一本,一本关于巴甫洛夫的狗和薛定谔的猫的书。图书管理员说这听起来很熟悉,但我不知道我们这里有没有。

完美。非常好。里面有很多科学。一些社会科学,一些硬科学。我喜欢它。是的。是的。一些不确定性。是的。是的。可能在那里。可能在那里。它听起来很熟悉。酷。好吧,又是精彩的一集,我认为。所以谢谢你,Michael。是的。感谢大家收听。我想我们下周再聊。再见。是的。再见。