We're sunsetting PodQuest on 2025-07-28. Thank you for your support!
Export Podcast Subscriptions
cover of episode #427 Rise of the Python Lord

#427 Rise of the Python Lord

2025/4/7
logo of podcast Python Bytes

Python Bytes

AI Deep Dive AI Chapters Transcript
People
B
Brian
Python 开发者和播客主持人,专注于测试和软件开发教育。
M
Michael
帮助医生和高收入专业人士管理财务的金融教育者和播客主持人。
Topics
Michael: 我介绍了 Git Town,这是一个用于管理 Git 工作流程的工具。它提供了一组高级命令,简化了创建、同步、切换和合并分支等常见任务。Git Town 解决了在使用 Git CLI 或大多数 GUI 时缺乏内置工作流程的问题,使团队协作更加高效。我分享了 Git Town 的基本和高级命令,并强调了它在处理边缘情况时的优势。我建议观看 Git Town 的七分钟视频以了解更多信息。我还讨论了在 Windows 系统上使用 Git Town 的可能性。 Michael: 我还介绍了两个 Git 工具:git-who 和 watchgha。git-who 用于识别代码库中各个组件或子系统的负责人,这与逐行显示代码作者的 git blame 不同。watchgha 实时显示 GitHub Actions 的运行状态,方便开发者监控 CI/CD 流程。 Michael: 最后,我分享了关于 pysqlscribe v0.5.0 的更新,它现在支持解析创建脚本来自动识别数据库结构。我还讨论了使用 mdformat 格式化 Markdown 文件的经验,并介绍了一个方便的命令行参数组合:`mdformat --number --wrap no`。最后,我总结了使用 uv 工具安装多个依赖项的方法,以及一个用户提供的使用 uv 管理多个 Python 版本虚拟环境的技巧。 Brian: 我讨论了 PEP 751,这是一个新的 Python 依赖项锁文件标准。它解决了不同工具使用不同锁文件格式的问题,提高了安装的可重复性。PEP 751 使用 TOML 格式,并包含了版本、哈希值和上传时间等信息,方便开发者管理依赖项。我提到了一些工具,例如 mouse bender,已经开始支持 PEP 751。 Brian: 我还介绍了 Dave Johnson 的一篇关于使用 uv 工具和 PEP 723 部署 Python 脚本的文章。这篇文章详细介绍了如何使用 uv 添加依赖项、运行脚本以及在不同操作系统上的部署方法。文章还解释了 uv 与其他工具(如 pipx)之间的关系,并提供了一些 Windows 系统上的实用技巧。

Deep Dive

Shownotes Transcript

您好,欢迎收听 Python Bytes,我们将直接为您带来 Python 新闻和头条新闻。这是第 427 集,录制于 2025 年 4 月 7 日,我是 Brian Auchin。我是 Michael Kennedy。

本期节目由 Posit 包管理器赞助播出。稍后节目中我们会介绍他们的内容。如果您想联系我们,可以通过 Mastodon 或 Blue Sky,链接在节目说明中。如果您通过播客播放器收听,

偶尔来现场观看或查看往期直播节目也很有趣。您可以访问 pythonbytes.fm/live。我们通常在周一上午 10 点进行直播,但有时会有所更改。无论如何,很高兴您能来到这里,有些人会进来提问,这很好。

此外,节目结束后,一切尘埃落定后,我们会通过我们的新闻通讯发送链接。因此,请访问 pythonbytes.fm 并将您的姓名添加到电子邮件新闻通讯中,您将收到直接发送到收件箱的链接和一些额外内容。非常好。绝对的。Michael,你有什么要开始的吗?让我们开始一段旅程吧,Brian。是的。

让我们开始一段旅程。好的。我想去 GitTown 旅行一下。GitTown 18.3。让我们开始吧。GitTown 是一个有趣的项目。我相信它是用 Python 编写的。我稍后会再检查一下。虽然这并不完全相关。这是一个您可以使用的工具。其理念是使用 Git CLI,或者说实话,大多数 Git GUI,例如,我非常喜欢主要通过

使用 SourceTree、PyCharm、VS Code 等我碰巧使用的 GUI 操作来进行 Git,对吧?我不喜欢这样,假设我的编辑器不知道任何源代码控制是什么,然后转到终端进行操作,然后再返回。我喜欢这种方式,尤其是在,你知道的,这就是为什么我上周提到了那个基于 2E 的 Git 分支资源管理器,我们上周讨论过用 Rust 编写的那个。因此,您会发现大多数这些工具,尤其是 CLI,但通常所有工具,

它们擅长 Git 和源代码控制的原子操作,但它们没有内置工作流程。我的意思是,我想从这个分支创建一个功能分支,在我处理功能分支时,

我希望能够键入单个命令,让该分支确保它与当前工作保持同步,而不会破坏我当前正在进行的工作。也许在我正在处理的功能分支的中间,我需要创建一个错误修复分支,执行此操作,然后返回,同步它们。有一些您想做的高级事情,对吧?因此,GitTown 是一个 CLI,我认为它是一个插件。我认为 Git 有类似插件之类的东西,因为命令仍然是 git space 命令。

Git 的子命令,对吧?所以它不是一个完全独立的东西。无论如何,它操作所有,它将所有这些整合在一起。因此,如果您即将要描述的内容对您来说很有趣,那么您真的应该观看 git-town.com 上的这段 7 分钟的视频。上面写着,请查看一下,对吧?所以只需观看这段视频,它会介绍不同的场景,向您展示它的工作方式等等。但是,如果您跳转到 GitTown 网站,

GitHub 仓库,它会让您更好地了解那里的所有部分。而我说用 Python 编写的,我的意思是是用 Go 编写的。好的。所以 Git,它有一些不同的命令。它说我可以键入 Git,就像在 Git 仓库中一样,我可以键入 Git space hack,这将创建一个新的功能分支,我可以探索该分支,而不会影响任何主要工作。如果我需要丢弃它或其他什么,都没关系。这有点像探索性的方式。

积极意义上的 hack,而不是 hack 指的是,我有一件连帽衫,我的房间里很阴暗之类的事情。或者同步,如果我在顶部,如果我在某种功能分支上,我可以从主分支更新该分支。因为如果您有一个长期运行的功能分支,您想要做的事情之一就是定期从主分支拉取

在那里,这样您就不会离它太远,对吧?如果由于某种原因,例如当您想返回时,您希望它只是您的更改,而不是您的更改加上您可能一直在处理的冲突,并且您基本上又进行了一轮。因此,您只需键入 git space sync。这很酷。您可以键入 git switch 通过 UI 更改分支,或者一旦您对功能分支感到满意,您可以说 git propose,这将创建一个合并

它将为功能分支创建一个拉取或合并请求,回到 GitHub 等。所以有很多像这样的很酷的东西。好吧,我以为它会要求它跳舞。没错。我的意思是,我知道我们没有谈论太多,我知道这是七年级,我们都很害羞,但是你愿意和我一起去跳舞吗?我爸爸可以开车送我们。是的。

另一个是您可以执行诸如 get ship 之类的事情,这将合并已完成的功能分支,然后在成功交付后将其删除等等。所以有一些很酷的东西,但当然我建议观看这段视频,这段 7 分钟的视频,看看这是否对您来说很有趣。我认为我喜欢它。我认为它很酷。我可以,有一些,有一些很酷的东西我总是忘记,例如 get town rename。是的。

我的意思是,重命名并不难,但拥有一个小小的功能是很好的。是的,所以……

绝对的。如果您观看视频,您会看到有很多,实际上这东西主要围绕着,是的,您可以,您就像,好吧,为什么我不能只做,你知道的,从这个分支合并这个和那个。当然,您可以执行这些操作。但它有一些小的步骤来捕获边缘情况。例如,在确定您不希望任何更改发生更改和其他情况下,它将使用隐藏功能进行某些操作。例如,

这些命令中的每一个通常都会导致大约五、六或七个 Git 命令。很整洁。值得一试,特别是如果您喜欢通过 CLI 使用 Git 或您所在的团队希望以真正结构化的方式执行这些操作。我肯定会尝试一下。实际上,我使用了,我不记得我们上周称它为什么,SEG 还是其他什么。但我本周末用它查看了我们服务器的 Git 日志。

我之前不熟悉的项目,看看发生了什么。太棒了。您在 Windows 上试过吗?例如,我希望有一个 Windows 终端后续操作。

我用它做什么?记住,您想知道它是否可以在 Windows 上运行。是的。您是在 Mac 上做的还是?在我的 Mac 笔记本电脑上使用它。好的。那么后续操作仍在进行中。好的。我们也会在 Windows 上查看 GitTown。我们将去 GitTown 旅行一下。我相信它可能没问题。是的,它只是自动化了 Git,Git 在任何地方都可以运行。好的。上周,我们回到上周,我想我们讨论过……

讨论了一些 pep,今天我想讨论另一个 pep。这个来自 Brett Cannon。好吧,我在 Blue Sky 上看到他发布了。Pep,五组管道。

再试一次。PEP 751,不是 571,751 已被接受。那么这个 PEP 是关于什么的呢?它是关于锁定文件的。Brett 说这意味着 Python 现在有一个锁定文件标准,可以用作创建某种锁定文件的工具的导出目标。

对于某些工具,该格式也可以作为其主要锁定文件格式,而不是某些专有格式。所以我们已经有锁定文件了。几个,许多不同的工具都有锁定文件,但它们不是同一个锁定文件。它们就像 UV 有一个锁定文件,我认为 Poetry 有一个锁定文件,还有其他几个。

所以,呃,所以现在我们有一个标准化的文件,我实际上正在查看该标准。看起来很棒。我想到的事情之一,您期望的事情之一,您可以,呃,执行环境和版本以及包等等。呃,我认为很酷的事情之一。我,呃,

向下滚动到底部,有一个工具部分,它几乎是开放式的,这允许任意工具配置。如果其他工具如 poetry 或其他工具想要使用,尝试使用它或迁移到它,

但它并没有涵盖它们自己的一些配置,它们可以覆盖此配置并在其中添加一些额外内容,我认为这很酷。还有一个包工具。我不确定哪个,我不知道。您何时使用一个或另一个,但我将其留给一些教程编写者来弄清楚。所以这不是一个,如果您现在想尝试一下,

好吧,让我们先看一个例子。如果您正在收听,则可以在视频中查看实时版本。但我们也会链接到它。它在 PEP 中。有一个例子。大部分情况下,这是相当可读的,我对它的设置方式非常满意。它使用 TOML 语法。您甚至有像……

当然,哈希等等,如果您想保留哈希以确保它是正确的东西。所以这一切都很好。另一部分,

是,我现在如何使用它?有一些,关于如何教授它的信息,当然。围绕被拒绝的想法的一些讨论。哦,我忘了提名字了。它的名字是 pyloc.toml。所以,或者 pyloc something.toml。有

这就是他们想出来的。它现在与任何其他工具都不冲突,而且是合理的,所以很好。如果您现在想尝试一下,

我以为我,我以为我们有一个实现。呃,有一个,有一个,好的,我现在找不到,但是有一个,一个,一个实现。呃,这只是一个例子,它在 Brett 的工具 mouse bender 中。所以,呃,mouse bender 允许您使用它,如果您现在想使用它。所以,我,我,

我预计一些其他工具也会采用它。而且我,我,

我预计,例如,UV 或其他东西可能会……我不知道。我不参与 UV,但我预计这些工具中的一些会很快采用它。但我们会看到的。是的,我……好吧,首先,祝贺 Brett Cannon。我知道你一直在努力工作很长时间了。我们到了。非常令人兴奋。我相信 PyCon 上会有一些关于此的对话。是的,非常整洁。所以我喜欢的一件事是格式。我看到了……

例如,哈希与实际要求的固定版本位于同一行。所以我尝试在我的 requirements.txt 文件中使用哈希,哈希如此压倒性地占据了您实际在差异中拥有的内容的版本,以至于就像,好吧,这只是一堆哈希要求

当我查看差异时,变化,我必须寻找实际的新版本,例如,好吧,这些版本中哪个发生了变化,新版本是什么等等。所以这种方式看起来,它看起来将会,好吧,它也可能在哈希的末尾有所不同,但首先出现在行上的内容是实际的版本号轮等等。所以我认为这将非常好看。所以是什么

我可能会把哈希放回去。是的,我认为有一个上传时间很酷。所以,如果您不想处理哈希,但您确实想将上传时间作为检查内容的一种方式,那就很酷。是的,您只是知道它有多旧。是的。是的,是的。对于不使用 Calver 或滥用 Calver 的东西,你知道的。它是五分钟前还是五个月前?这可能对您很重要。是的。是的,是的。非常酷。太棒了。我支持它。做。

你知道什么也很棒吗?那是什么,Brian?我认为 Posit 非常棒。它们很棒。非常棒。所以我想花点时间感谢我们的赞助商。本期 Python Bytes 由 Posit 的朋友们赞助播出。Posit 最近对 Python 社区进行了巨额投资。最初以 RStudio 而闻名,他们一直在为 Team Python 构建一套工具和服务。在过去的几年里,我们了解到……

一些相当可怕的术语,如类型欺骗、供应链攻击、混淆代码等等。所有这些都围绕着这样一个想法:您安装 Python 包时,实际上是在互联网上运行任意代码,在您的开发机器上,通常甚至在您的生产服务器上。仅仅想到这一点就让我不寒而栗。这甚至没有触及围绕外部包的可重复性问题,但是

有一些工具可以提供帮助。Posit Package Manager 可以为您解决这两个问题。将 Posit Package Manager 视为您的个人包管家。您可以使用它在防火墙内构建自己的包存储库,以确保您的项目安全。您可以上传您自己的内部包以共享或直接从 PyPI 导入包。您的团队成员可以使用 pip、poetry 和 UV 等工具以正常方式从这些存储库安装。Posit Package Manager 将帮助您管理更新,确保您使用的是最新、最安全的包版本。但 Posit Package Manager 还会对您的存储库进行时间点快照,您可以使用它来可重复地重新运行您的代码……

将来可重复地重新运行您的代码。Posit Package Manager 会报告具有已知 CVE 和其他漏洞的包,以便您可以领先于威胁。如果您需要最高级别的安全性,您甚至可以在与网络隔离的环境中运行 Posit Package Manager。

如果您在一个重视安全性的数据科学团队工作,那么您应该为您的组织和您自己检查 Posit Package Manager。今天访问 pythonbytes.fm/ppm 并获得三个月的免费试用,看看它是否适合您。网址是 pythonbytes.fm/ppm。链接位于您的播客播放器的节目说明中。感谢 Posit 支持 Python Bytes。确实。谢谢,Posit。这是一个很酷的项目。

对包进行更多控制总是一件好事。好吧,Brian,我想继续讨论 Git 的主题,并讨论另外三个 Git 项目、Git 主题,至少我认为是这样。谁?所以我们知道在哪里,就像这是他们在早期写作课上教你的东西一样,

所有的 W,对吧?谁、什么、在哪里、何时、为什么?我们如何涵盖这些内容?我们已经从哪里到谁,现在我们正在讨论 git-who。所以我一直很喜欢 git blame,或者更广泛地说,像源代码控制 blame 一样。例如,好吧,这是谁做的?

你看到那行代码了吗?我应该和谁谈谈这个?要么他们不太好,要么我们需要和他们谈谈,要么这里发生了一些更复杂的事情,我需要更好地理解它。但是我应该和谁谈谈这行代码呢?你明白我的意思吗?它的工作方式是,您可以对文件运行它,它会逐行显示谁对该特定行进行了最后更改,对吧?编辑器现在支持这一点。

现在非常容易,例如在 PyCharm 中,它实际上会覆盖谁最后编写了函数或其他内容。如果您单击它,它会将 get blame 滑出。但这是一种逐行的方式。如果我想知道……

整个项目。例如,如果我去到仓库并键入 get who -L,它会显示谁进行了多少次提交、多少次更改、多少行,他们上次何时这样做,作为项目的摘要,而不是行的摘要。很酷,对吧?所以这很容易做到。而且

您可以进入子目录并对其进行探索,并询问,谁最近在这个特定子目录或其他地方创建了更改?很酷,对吧?所以这是一种对 Git Blame 的自然扩展。好的,所以您甚至可以给它一个特定文件,并说谁修改了这个文件?是的,我认为它会显示对该特定文件有多少贡献。

我不知道你是否可以给它一个文件,但如果目录中只有一个文件,你当然可以。- 这很酷。- 你可能也可以给它一个文件。是的,它只是向您显示谁最近在这个仓库或这个仓库的子目录中活跃以及活跃程度。

是的,blame 部分是我小心尝试进行代码美化的原因之一。你想破坏它吗?好吧,我不想为此负责。所以,如果您只是排列一些东西以使其看起来更漂亮,请小心,因为您现在是该行代码的所有者。是的,这是一个有趣的角度。我想知道你是否应该创建一个格式化程序帐户,然后……

让格式化程序进行格式化。好吧,实际上这是其中之一,其中之一是可爱的,将分离,分离格式化内容。所以我想,这是我试图教人们的一件事,如果清理很棒,但要在单独的提交中进行。不要在与大量实际代码更改相同的提交中执行此操作。所以,当然。但这并没有解决 blame 部分。不,它并没有真正解决 blame 部分,但是

get town 做的另一件事是,它会,它会非常积极地使用 squashing。因此,当您完成所有功能分支并进行 20 次更改时,您可以将其压缩到单个提交中,作为发布 PR 流程的一部分。因此,至少当人们查看 blame 时,它就像所有内容一样。

一个与该功能相关的提交,而不是粗略的格式调整调整空间,你知道的,像随机一样,如果你把它做得太小,你的评论就像真的真的不具有历史意义,你知道的,就像这是一个格式化语句一样,很棒,为什么,我们什么时候这样做,你知道我的意思吗?是的,实际上我有点忘了不是每个人都这样做,所以我总是这样做,做 squash 工作流程,你是一个自然的 squasher,好的,自然的 squasher,是的

好吧,主要是因为回滚东西更容易。因此,如果存在,如果某些东西确实会导致下游问题,您可能希望一起回滚所有这些工作。是的。是的,这是一个很好的观点。好吧,

接下来是 watcha。Watcha。好的。Watch,G-H-A,但没有大写。所以 watchga。这来自 Ned Matchelder,不是他把它寄给我们,而是他创建的。这只是另一个快速获取的东西。我认为人们会觉得它很重要。所以您可以做的是,您可以安装它,然后它将允许您实时查看 GBA 的状态。

GitHub Actions。想象一下,已经发生了一些更改。您正在针对不同版本的 Python 运行对话。有一些待处理的其他请求正在排队,并且您

并且您正在等待它们运行。您只想了解,例如,这些什么时候完成?它们需要多长时间?因此,您可以将其指向具有 GitHub action 的 GitHub 仓库。这太棒了。很酷,对吧?是的。是的。我经常打开一个 get 选项卡来观看这些内容。但将其直接放在命令行中。不错。是的,它就像一个实时更新,非常 2E 的感觉,对吧?它不仅仅是一系列文本,而是……

UI 正在更新和更改,每个操作都有进度条等等。是的,很酷。是的,好吧,Ned,干得好。这太酷了。好了,这就是我的主要项目。轮到你了,Brian。好的,我们开始了吗?不,对于你的最后一个。你还有一个,不是吗?哦,我还有一个?是的,我认为你还有一个。是的,接下来我想谈谈 UV。是的。

所以这是,这是,这是 Dave,Dave J。所以 Dave Johnson 的文章分享,它被称为像专业人士一样分享 Python 脚本 UV 和 pep 723 以实现轻松部署。我们在不同的、不同的剧集中讨论过很多这些部分,但我真的,我真的很喜欢,我真的很喜欢这个文章。这是一种,

如果您想编写带有依赖项的 Python 脚本,这在以前是一个问题,现在不是了,但如何执行此操作的所有不同部分。所以它首先讨论 UV 和 Uv 和 PEP 723 是什么。这是允许您在文件顶部添加一些内容以包含您的依赖项等等的 PEP。

所以,呃,为了设置舞台,我们不必深入研究这是什么,但它提供了一个,一个命令行脚本,称为 word lookup。

它有一些像 arg parse 这样的内置内容,但它也使用 HTTPX。所以这是一个超出脚本范围的额外依赖项。如果您正在编写网络抓取脚本,您通常会有一些额外的依赖项或其他内容。然后这就是脚本,它教你如何安装 UV,但你可能已经安装了它。然后……

我该如何添加那个东西?您不必记住如何在顶部放置它的格式,因为如果您说 UV add script,然后您提供脚本名称以及您的依赖项是什么,它会自动为您填写。它会将该脚本块粘贴到代码的顶部,这太棒了。我认为我知道这一点,但忘记了它,所以我很高兴它在那里,只需添加那个小脚本标签即可。

然后,呃,讨论了为什么,这与,与,呃,Tomo 的 pipe 项目以及与它的关系有何不同和相似之处,我有点喜欢额外的教学。您不必知道脚本的这一点,但这对于人们了解整个生态系统来说是件好事。呃,讨论了使用,呃,使用 UV,UV run,呃,

然后跳到说您可以使用 UV run,但您也可以将 UV run 添加为主 shebang,用于 Linux 和 Mac 用户。您可以将其添加到顶部,它会提供您必须将其粘贴到顶部的特定环境 SUV run 脚本。就是这样。

实际上非常有趣。然后您不必说 Python 或 UV run。如果它是一个可执行文件,您可以只说脚本名称,它就会运行,这太棒了。我没有尝试在 Windows 上使用它,但显然您可以围绕如何在 Windows 上调用它进行一些操作。我没有尝试过,但您可以使用 Py 和其他东西。所以有一些 Windows 帮助。

尊重 Windows 上的 shebang,这是一种添加的方法。好的,很酷。然后,呃,他建议创建一个,像一个,像一个工作,呃,一个带有命令行、CMD 脚本的额外脚本,以使用您的、您的脚本。所以如何,如何使用 Windows 完成循环。所以写得非常好,呃,对于人们,呃,编写 Python 实用程序脚本。所以,

这实际上非常好。是的。干得好。是的,这就是我们主要主题的全部内容。我们都有额外内容。你想先跳到你的额外内容,还是我先做我们的?我先快速做我的。当然。我有一些。我会尝试快速浏览它们。首先,我谈到了 PySQL Scribe,如果您正在为您的代码编写原始 SQL,您

但您希望有一些工具支持来帮助您在 Python 中使用,这个 PySQL scribe 允许您通过代码表达表的结构及其关系。然后您可以询问它,例如,这将是什么查询?然后它将根据哪个数据库……

方案或方言(如 SQLite 与 Microsoft SQL Server 查询语法)生成您想要生成的查询等等。当我们讨论它时,我建议,嘿,如果有一种方法可以指向一堆创建脚本,这些脚本定义了您的 100 个表,并且它只是知道这一点,那岂不是很好吗?好吧,运行该项目的 Daniel 说这是一个好主意,并且刚刚发布了一个版本,您可以将其指向创建脚本的目录。

它将使用它们来理解您的整个数据结构。干得好,Daniel。所以这里有一个小奖励。我们讨论过,这是一个长期运行的项目。我们讨论过格式化 Markdown,使用 MD format,我已经开始采用了。我接下来会谈到这一点,但是 Hugo,

指出,嘿,我使用 prettier,它已经存在很长时间了。它现在有一个 markdown 格式。所以这从 2017 年开始就非常酷。人们可以查看一下。我会在节目说明中链接到它。如果您想使用它,呃,

然而,我将继续使用 MD 格式,并将其用于我即将出版的《TalkPython in production》一书的整个 Markdown 结构。就像我说的那样,全是 Markdown。我发现的一件事,我不知道你是否知道,布莱恩,但我肯定不知道。这是一个非常有趣的代码风格。当你将其用于 Markdown 时,它会将 Markdown 渲染成 HTML,然后美化它,然后,你知道,清理它,然后它会再次运行 Markdown 解析器。如果 HTML 不同,它将回滚该更改。哦,这很酷。是的。所以我的其中一章,显然我放了一堆插件,其中一个插件不太好,因为它改变了格式。我想,哦,是哪个?但我喜欢它们。

我不知道。也许我现在需要调试它。我只是没有格式化一章。你知道哪一章吗?13。显然,显然是13。无论如何,我发现我认为非常好的命令是使用,我把它写下来了。它在节目笔记中,但我必须找到它。它是获取,例如,MD 格式破折号破折号数字。所以它会重新编号那些东西,这很棒。

然后这个,我以为我会喜欢它来包装它,但是我的所有编辑器实际上都保留了包装格式,以便它可以帮助你更好地看到结构,即使 Markdown 渲染器没有。所以看起来真的很糟糕。所以如果你说破折号破折号包装否,它实际上会明确地解开包装,如果你不小心放了一些进去的话。所以我喜欢数字和包装否,不仅仅是……

不改变它,而是实际上解开包装,我认为这真的很酷。作为其中的一部分,我们确实谈到了 UV,对不起,我们谈到了 pipx inject。上次你正确地指出 uv tool install 破折号破折号 with 是等效的。但我想指出的是,当你,我在节目笔记中写了,如果你想使用 with 和 uv tool start 像 inject 一样,你必须说 with 的次数与额外的次数一样多。所以 uv tool install MD format with MD format GFS。

GFM,破折号破折号宽度,MD 格式前题,破折号破折号宽度,等等。所以如果你想获得那种注入的感觉,你必须分别为每个参数,每个额外的东西或任何东西使用宽度。

所以无论如何,这是一件事。另一个你现在可以看到的是,如果你正在观看直播或看到我正在使用的图片,我正在使用 Zen 浏览器,我真的很喜欢它。它建立在 Firefox 之上,这很棒。我真的很想要这种简洁的格式。我们只是在侧面有标签图标,所有东西都在顶部,它给你更多空间,对吧?好吧,Firefox,如果你是一个 Firefox 纯粹主义者,现在已经想出了这个

左侧的标签,这是他们上周刚刚发布的一个全新功能。我认为是,但是如果你抓住那个小标签的宽度,然后把它滑到它们的图标大小,它看起来就像我现在屏幕上显示的一样,布莱恩,它只是在左侧有标签图标,以及顶部的地址栏。新的 Firefox 非常好。仍然缺少 Zen 带来的东西。这真的很酷。但无论如何,我想告诉人们,这现在是一个选项。很好。是的。最后,最后一件事,

在我这边,是来自 James Fallon 的关于 UV 的后续。Falcon,对不起,James Falcon。感谢你发来这个。他说,嘿,我也是 UV 爱好者,我一直坚持使用 UV,因为它有一个它没有解决的情况。然而,你们说服我克服它并解决它。所以他维护一个跨多个 Python 版本支持的库,需要处理特定版本中的错误。例如,它在 3.8 中不起作用,但在 3.10 中工作正常。所以这个想法是……

最初,我使用的是 PyENV,因为你可以用这些不同的环境创建虚拟环境,然后按名称激活它们。但是 UV 最初的工作方式并非如此。所以 Woody 说,嘿,看,我在我的配置文件上创建一个虚拟环境的位置,也许是项目的子文件夹。然后我现在使用 AXE。

UV 创建特定版本的虚拟环境,你知道,3.11、3.12、3.13,等等,用于该项目。然后他包含一个批处理文件,你可以说,使用这个虚拟环境项目名称,它会自动找到它并为你激活等等。所以它给了我们一个例子,说明你如何使用 UV 来绕过不同版本。这很酷。是的,所以有一个小的批处理脚本……

人们可以查看,如果他们想使用它。很好。好的。在节目笔记中。是的。这就是我的额外内容。好吧,所以对于我今天的额外内容,所以是四月,对吧?我们四月一号做的一件事,有时会发生愚人节恶作剧。其中一件事,所以有,有,有好的愚人节恶作剧,然后有坏的愚人节恶作剧。所以我要介绍两者。

首先,我认为一个好的,这是一个由 PSF 转发的视频,但它说 Cult Repo。我不确定。我看了看,我想,这是一种非常奇怪的事情,可以从 PSF 做一个官方笑话。Cult Repo 小组制作了许多关于,比如高度制作的关于邪教的纪录片。

编程语言及其起源或编程框架。就像他们有一些关于 Vue.js 的,也有一些关于 Angular 的。这就是它的来源。好的,所以视频是 Guido van Rossum 作为 Python 的 BDFL 回归。这是一个两分钟的视频,或者将近两分钟。太搞笑了。我喜欢它。它显示了他输入……

这句话,每个人,标准是什么?哦,董事会不再是。- 指导委员会。- 指导委员会不再必要。我想指出几件事,我喜欢这个视频。

呃,Brett Cannon,他是,嗯,他是,呃,被列为著名的 Python 引用家,嗯,是他的头衔。然后,呃,然后 Guido 继续说他说的其中一件事,他说 Guido 说,正如我总是说的那样,呃,来这里是为了语言,呃,留下来是为了社区。这不是 Guido 的名言。这是 Brett 的名言。所以,嗯,

著名的 Python 引用家在 Guida 说那句话之后被划掉了,这很有趣。

然后过了一会儿,这是谁?Barry Warsaw 走进来说道,Guido,你准备好发布 Python 2.8 了吗?这永远不会发生,对吧?所以这很好。Guido 说缩进就是启蒙。他说,或者 Barry 给他记功说那句话

嗯,成为 Pythonic 意味着与空白融为一体,嗯,这很好。无论如何,嗯,嗯,然后它以,嗯,呃,Guido 宣布他将实现一个新的关键字来结束。也许它有点像 if,但更 Pythonic。所以也许一些东西,它给出了一个例子,也许打印 Python,今年夏天上映的纪录片。而且,

我希望那个是真的。我希望我们能拍一部纪录片。好吧,现在已经是夏天了,或者快到夏天了。如果我们拍一部纪录片。好吧,我们很快就会得到它,那将是很棒的。如果这个 Cult Repo 公司制作它,我认为它会非常好。是的。

当我第一次看到这个时,我想,我看到一条推文来了。我想,嘿,随便吧。有趣,一个小笑话。我只是认为它是一条推文。然后 Nick wall 发送过来,像,等等,你应该看看这个。这很有趣。我想,看他们。哦,这比我意识到的要多得多。这是,这是做得很好。这是好的。好的。这是一个,这是一个做愚人节恶作剧的好方法。我从未做过一个。我从未做过像技术恶作剧一样的事情。所以我决定今年尝试一下。

结果并不理想。所以,你知道,你知道,这个,你听说过吗,如果你必须解释一个笑话,它不好笑,这就是我解释一个笑话。所以不好笑。所以有 PyTest repeat。所以我一直在做测试代码。我一直在做关于 PyTest 插件的系列。

而 PyTestRepeat 是我一直使用的插件。我注意到它还没有在上面进行测试,它只在 312 上进行了测试,还没有在 313 或 314 上进行测试。好的,所以 314 是 3.14。Py 以 3.14 开头,但 Py 是一个无理数。

而且它不会重复。所以我试图开的玩笑是,我在四月一日发布了一集关于测试代码的节目,Python 3.4 不会与 PyTest repeat 重复。嗯,

我想它是,我甚至试图让它,我认为,很明显地说,不幸的是,它似乎在 3.14 上不起作用,即使没有合理的,没有无理的。是的,那很好。我听了那一集。做得很好。无论如何,我收到了一些反馈,人们感到困惑,想知道为什么我要测试 3.14,因为它是一个 alpha 版本,而且……

无论如何,我不得不向五个人解释它实际上很好。所以 TLDR 是三,PyTest repeat 与 Python 3.14 完美配合。所以不用担心。

无论如何,如何不做愚人节恶作剧。我想这就是我们所有额外的项目,对吧?当然是的。让我们看看我需要解释多少这个笑话,嗯?不,我认为这个很好。这个很好。这个来自 Programming Humor Twitter 提要,它说,你在代码中发现最好的东西是什么?他们几乎总是关于……

这个线程中的评论。所以这里有一个……这实际上是 Python。所以这是一个有人在代码中找到并发布的评论。

但是如果你仔细查看并查看下面的评论,你会发现一组 132 条类似的评论。它们并不都很好。所以这是这个线程顶部的内容。它说,作为一个评论,你可能会认为这个函数已经过时了,它似乎什么也没做,你是对的。但是当我们删除这个函数时,由于某种原因,整个程序崩溃了,我们不知道为什么。所以它会留在这里。

所以我把笑话命名为,它会留在这里。让我看看我能不能找到几个。不过,这是我最喜欢的一个。这可能应该是第一行,但这是作为对原文的回应而来的。一个名叫 Jeppe 的人指出并说,不是我的,但我发现这很有趣。这是一个基于 C 的语言类型,因为它是评论的斜杠斜杠。

亲爱的程序员,当我编写这段代码时,只有上帝和我知道它是如何工作的。现在只有上帝知道了。因此,如果你试图优化这个例程并且失败了,大多数情况下都会失败,请增加计数器作为对下一位用户的警告。然后下面有一个变量说这里浪费的总时间,254。所以很好。

这很好。而且它继续下去。如果你不想让你的其余部分,如果你想浪费半个小时,你可以直接到这里,这里有很多好东西。所以就是这样。

这很好。是的,我认为这是一个很好的。是的。我只有几次实际上至少我至少有一次关于某些代码的记忆,这些代码看起来什么也没做,除了显然它正在运行和计时。我相信这只是计时。就像如果你把它拿出来,它会改变程序其余部分的计时,然后它就不起作用了。是的,我确实遇到过这种情况。你会发现某种并发错误,它可以防御这种错误。是的。

是的。是的。C 代码就是这样。是的。很难看到错误。这是真的。很难看到错误。这很好。它不是。不,不,它不是。我们最好停止。我们最好把它称为一集。好的。非常感谢。再见。再见。