We're sunsetting PodQuest on 2025-07-28. Thank you for your support!
Export Podcast Subscriptions
cover of episode #422 You need 4 spaces

#422 You need 4 spaces

2025/3/3
logo of podcast Python Bytes

Python Bytes

AI Deep Dive AI Chapters Transcript
People
B
Brian
Python 开发者和播客主持人,专注于测试和软件开发教育。
M
Michael
帮助医生和高收入专业人士管理财务的金融教育者和播客主持人。
Topics
Brian: 我推荐使用Hynek Schlawack提出的基于`uv`的Python项目布局,它使用简单的`pyproject.toml`文件和`uv.lock`文件来管理依赖,替代传统的`requirements.txt`文件,并建议将`uv.lock`文件提交到版本控制中。这个方法简化了依赖管理,提高了项目可复用性。此外,我还讨论了如何使用`uv run`和`uv sync`命令来运行和同步项目依赖。在`pyproject.toml`文件中指定Python版本,并建议对于不需要版本控制的项目,将版本设置为0。最后,我还提到了`pyproject.toml`文件中依赖分组的用法,以及如何使用`uv`作为构建后端。 在Łukasz Langa的文章中,我看到了Python在浏览器端应用的未来展望,特别是SPy项目,这是一个用于在浏览器中运行Python的早期研究项目,旨在提供一种更流畅的Python在Web浏览器中的运行体验,未来可能消除前后端语言的差异。虽然目前该项目尚处于早期阶段,但其潜力巨大。 最后,我还简要介绍了我的一个个人项目:Server Hot Reload,这是一个单一的JavaScript文件,可以实现Web应用程序的模板热重载,无需IDE插件等复杂配置。 Michael: 我介绍了`aiolimiter`项目,这是一个高效的异步IO速率限制器,可以帮助开发者精确控制代码段的执行速率,避免因为过多请求而导致系统过载。它实现了漏桶算法,允许开发者设置请求速率,并通过`async with`块来限制代码段的执行速率。这个项目可以有效地解决与外部API或数据库交互时可能出现的速率限制问题。 我还介绍了Reloadium项目,这是一个热重载和性能分析工具,可以实现代码修改后浏览器页面的自动更新,并提供实时性能分析功能,提高开发效率。它支持多种框架和库,例如Flask、Django、SQLAlchemy和pandas,并具有错误处理和事务回滚等功能。

Deep Dive

Chapters
This chapter explores Hynek Schlawack's approach to Python project layout using pyproject.toml and the UV tool. It emphasizes the benefits of using UV.lock for dependency management and the simplification of the project structure.
  • UV-based project layout for production apps
  • ditch requirements.txt files
  • pyproject.toml for managing dependencies
  • UV.lock for dependency locking
  • using UV run and UV sync

Shownotes Transcript

您好,欢迎收听 Python Bytes,我们将直接为您带来 Python 新闻和头条新闻。这是第 422 集,录制于 2025 年 3 月 3 日。我是 Michael Kennedy。我是 Brian Ocken。本期节目由我们赞助播出。查看 Brian 的

PyTest 课程。查看 TalkPython Training 上的课程。我们已经有将近 475 个小时了。275 个小时。没那么多。TalkPython 上有 275 个小时的课程。那里有很多课程可供选择。Amber 撰写书籍和 Patreon 支持者以及所有这些内容。非常感谢。

此外,我们还在不断改进和完善我们的时事通讯,我认为它可以为您提供我们可能没有明确指出的剧集见解,当然,这些见解也不在节目说明中。因此,请访问 pythonbytes.fm,点击时事通讯,输入您的电子邮件。我们会善待它,但我们会向您发送很酷的东西。通常在节目当天或节目后的第二天。是的。所以,话虽如此,Brian。

我们今天如何开始我们的节目?让我们从视频开始吧。等等,如果人们想观看它,这不是已经是视频了吗?是的,是的。你的想法很超前。是的,我试图将它添加到舞台上。发生了什么事?哦,他们错了。无论如何,就是这样。

技术故障,听众不会理解。我们通常不介绍视频,因为我不知道为什么,但我似乎不怎么看 Python 视频。但这个视频不容错过。Hinnick 发布了一个名为“我 2025 年基于 uv 的 Python 项目布局,用于生产应用程序”的视频。

我关注这个视频的部分原因是想看看他在做什么,我喜欢 UV。但是,当你观看它时,他的示例是一个 FastAPI 应用程序。并且

在他的世界里,应用程序通常实际上是一个网站应用程序。稍后他将继续讨论 Docker,我认为,因为这是系列的第一部分。但这一部分已经足够让我觉得它非常有用。尤其是在我处理的一些事情中,我认为应用程序是任何打包的东西。

就像它不是一个包。它不是你放在 PyPI 上的东西,但它是你通常会使用 requirements.txt 文件的一堆代码。我更喜欢他的模型。所以我将加入。我有一些标签,因为很难导航。无论如何,快照视频。所以我将它们停止在我想要的地方。所以视频很棒。大约 25 分钟长,观看速度很快。

这里有项目布局。因此,他的项目布局使用源布局,实际上没有 requirements 文件。所有需求都在 pyproject.toml 中,而不是自定义锁文件或手动创建的锁文件,

他只是建议你让 UV 处理很多项目内容。实际上,即使使用 so,我们稍后会更详细地了解 PI project at Tamil 中的内容,但他建议你检查 UV 锁。因此,如果你让 UV 处理你的虚拟环境,它将创建一个锁文件。如果你提交它,那么

UV run 稍后将使用它并使用锁文件中的所有内容。你不需要运行 Python,你只需要……

克隆仓库,在你的项目上运行 UV run,它将从锁文件中获取所有内容。这就像固定依赖项一样。非常棒。是的,我完全同意他的观点。检查 UV 锁文件。然后你也不需要运行 UV run,如果你不想的话。你可以只运行 UV sync,它也会使用锁文件中的固定依赖项。然后,因为某些系统……

它们要求你使用它们的设置运行。例如,Pyramid,你需要使用 PSERV,然后是配置文件或 Flask。你可以像 Flask run 或 Django 一样。因此,如果你仍然想坚持使用它,你可以只运行 UvSync。所以 UvSync 将从锁文件中获取所有内容?是的,就是这样。

嗯,我认为它甚至可能会创建虚拟环境,尽管我还没有尝试过,是的,它会,如果你还没有虚拟环境,它会创建一个,如果你已经有一个并且它不同步,例如 uv sync,这就是同步的一部分,如果有人更新了一些需求,那么 uv 锁已经改变,那么 uv sync 将会……重写虚拟环境,所以

他还在展示如何指定 Python 版本,即在你的 pyproject.toml 中指定它。UV 将获取它并在必要时安装它。

然后还讨论了版本问题,因为 pyproject.toml 需要一个版本,但是对于许多应用程序来说,我们并没有真正利用版本,因为它只是你推送和运行的代码。所以他说,只需设置它。如果你不关心版本,只需将其设置为 0,然后人们就会意识到你没有使用它。世界上最常见的版本。是的,并且……

然后还讨论了最近出现的依赖项组的分离,UV 在 PyProject Toml 文件中很好地处理了这一点。这允许你根据应用程序的实际需求与开发的需求来分离你的依赖项。这将起作用,然后你可以运行——在生产环境中,它不会安装你的 PyTest 等内容。

但它会安装其他所有内容。但是,当你创建本地虚拟环境进行开发时,它也会获取这些内容。所以将所有这些放在一起非常酷。然后是构建系统,我并没有真正意识到你可以将 UV 指定为构建后端。我必须尝试一下。这很酷。你静音了吗?

我想到 Hatchling,我相信很多人指出 Hatchling 是默认的。而且,当我们第一次使用它时,它没有显示任何构建后端的原因是因为我们在应用程序模式下创建的。但我认为,如果我们在包模式下创建,有一种方法可以说明,嗯,你到底创建的是什么类型的项目?然后它会明确指定构建后端,我认为。所以无论如何。是的。

那里有很多选项,但是,是的,非常酷。是的,实际上也是一个令人愉快的视频。我喜欢他在那里做的事情。所以请查看一下。非常好。那么,让我们谈谈

Async 和 await。所以有一个很酷的项目叫做 AIO limiter,它是 async IO 的速率限制器的有效实现。这个项目来自 Martin Peters。Martin Peters 至少在某个时候是 Stack Overflow 上最活跃的 Python 用户。

所以这很有趣。这个项目是……他根据 Stack Overflow 上的答案创建的东西。所以不足为奇。Brian,我会稍微重复一下这个老生常谈。

我觉得 Python 中的 async 和 await 缺少一个非常重要的部分。那就是任何关于底层运行 async 代码的机制、控制、理解、调整或任何其他内容,对吧?如果我调用一个 async 函数并说 await 一个东西,它如何运行?好吧……

你不知道。它可能在你创建的事件循环中运行。它可能在你创建的循环中运行,一个框架创建的。你有时、经常、大多数时候,让我们说你通常无法选择如何创建该循环。例如,如果你使用 FastAPI,FastAPI 会创建一个循环并说,给你,你可以使用这个。希望你喜欢。你明白我的意思吗?而像 .NET 这样的系统,它们有线程池和 async IO,

池和上下文等内容,你可以说,嘿,在这个上,我希望你限制为 10。因此,如果你正在工作,一次只做 10 个。当你完成一个时,允许其他进入。否则,将它们排队并让它们等待,对吧?这样的东西在 Python 中是缺失的。所以

所以所有这些项目都在尝试将这种功能补充到 Python 的 async 和 await 中。这很酷。所以它确实给了你,假设你正在处理一个项目并且你正在使用外部 API。API 说你的速率限制是每秒 5 次。如果你超过这个限制,我们将开始失败。

并告诉你状态代码 429,请求过多,等待一段时间然后重试。但这会变得很糟糕,对吧?所以有了这个东西,你可以做的是我可以创建一个速率限制器并说,我愿意在 30 秒的窗口内允许 100 次调用,或者我给出的示例,在 1 秒的窗口内允许 5 次调用,或者其他任何内容,对吧?类似这样的东西。

然后你只需将其放入 async with 块中。然后在该窗口中发生的事情将受到此速率限制的限制。好的。很酷,对吧?所以它使处理这些事情变得非常容易。但通常情况下,我不会在这里进行所有调用。你明白我的意思吗?我的意思是,我希望系统中的所有异步调用都以这种方式受到限制,而不是我控制特定函数的那些调用,这正是我一开始抱怨的核心问题。

但这很好,你可以在某个地方创建一个,然后在任何你使用此速率限制作为上下文管理器的地方,它都将受到该速率限制的限制。所以它不必是相同的函数,它不必是所有代码都在块内同时发生。所以,你知道,这是一件非常好的事情,对吧?只要你把它放在所有需要的地方。例如,你可以遇到的一个问题是,你收到了太多的请求,你可以压垮你的数据库,因为

你正在等待并异步执行,你甚至可以不断地向数据库提供数据,即使数据库正在变慢、变慢、再变慢。所以在你的数据访问层中,你可以将所有查询都包装在一个这样的东西中,它说,不要超过每秒 10 次,或者任何对你的数据库来说合理的值。那是……

有点低,但你明白我的意思吗?就像你可以控制那样。所以你可能喜欢为你的数据库设置一个这样的速率限制器,然后可能为外部 API 设置一个。是的。是的。理论上。它们可以不同。对。好的。这说得通。是的。无论如何。是的。我认为这很酷。并且那些担心试图解决这个问题的人,他们可以使用它作为那里的工具之一。是的。

嗯,计算机有时速度太快了,我们就像,速度太快了,慢一点,你知道吗,就像让我们允许它完成所有工作,而不用等待任何工作一样,嗯,通常是好的,有时是坏的,有时是坏的,但最终的东西不喜欢它,是的,在观众席上,我们得到了一个哇,酷,Aziz 说他经常遇到这个限制问题,是的,太棒了,希望它有所帮助,是的,希望它能限制你的问题,它确实很棒,它会限制你的问题

接下来是什么?那太弱了。所以我想谈谈间谍活动。所以 Łukasz Langa 写了一篇关于间谍活动的文章。实际上,是关于在浏览器中 Python 未来可能性的文章。所以这也是一篇有趣的文章,而且图片也很好。一些很酷的山脉图片。无论如何。而且,你知道,他……

我相信他的观点,因为他参与了 Python 和所有其他事情。但这对于许多参与思考网络的核心 Python 人员来说很有趣。所以有一节是关于回顾的,我没有读过或看过,但显然 Gary Bernhardt 有一个关于 JavaScript 的诞生和死亡的演讲。我必须回去看看。

然后基本上谈论 Python 的历史。等等,等等。如果你没有看过 JavaScript 的诞生和死亡,它需要放在你的列表顶部。JavaScript 的诞生和死亡是一个具有开创性的视频,既滑稽又富有洞察力。好的。JavaScript 是笑话的一部分。好的。JavaScript。JavaScript。

好的。然后他继续谈论 Pyodide 和其他东西,你知道,使用 numpy 和 Cython 等。但这里的真正重点是一个新的研究项目,称为 Spy,大写 S,大写 P,小写 Y,我想。所以这就是我的东西。

这篇文章说 SPY 仍处于早期阶段的研究项目。目前,除非你计划贡献,否则不要尝试使用它。但也许你确实计划贡献。

它在实现和设计方面都还不完整,所以还处于早期阶段。但这听起来很酷。所以有这个——我喜欢这个想法。所以有这个——我将跳到演示部分,看看我们能否播放它。哦,也有视频声音,但我认为你听不到。但无论如何,有一个演示展示了它的工作原理,一些形状在移动。这实际上已经在浏览器中运行了。但你只是不能——我想它还不完整。

但这个,这个拥有类似 Python 的东西的想法。所以当你,当你像蓝色代码和红色代码一样时,这就是这个想法。蓝色代码就像 Python 一样运行。这对于调试等非常有用。因为你可以,人们习惯于用 Python 编写代码。然后有一个红色的移位模型,因为我们经常做的事情是,我们是否应该编译它,但这将,是的,

像预先计算很多蓝色部分的内容到预编译版本中。无论如何,所有的小编译部分都可以使事情运行得更快。但我真的很喜欢这样一个想法,即你有一个级别,你可以在其中将其作为纯 Python 运行,然后你可以部署它,它作为编译部分运行。无论如何,我可能弄错了,因为还处于早期阶段,但我们有指向这篇文章的链接,然后指向 SPI 项目本身的链接。

最近有很多活动。无论如何,我喜欢这个。而且主要的是,我不知道为什么我要提出这个。Python 在浏览器中的故事越来越好。无论如何。

我还将这篇文章添加为书签,因为它非常有趣,应该,你知道,可能值得讨论和阅读。所以感谢你介绍它。是的。如果你有更深入的了解,我们即将开始。我们稍后也可以再次提出它。是的。是的,还处于早期阶段。所以可能会有更多关于它的新闻。我对 Python 在浏览器中的可能性感到非常兴奋。如果它真的能无缝运行,它将开启一些令人惊叹的东西。是的。

而且实际上,在浏览器中说,但我们真正想表达的意思是,如果我们不需要不同的前端和后端语言,那么如果我们用 Python 做所有动态前端的事情,那就很酷了。是的,就是这样。我认为浏览器制造商可以做更多的事情来改善这一点。是的,例如……

他们中的每一个都提供了一个经过优化的 JavaScript 运行时,对吧?他们没有一个提供 Ruby 的 WebAssembly 版本,或者 CPython 的 WebAssembly 版本,Pyodide,或者 .NET for Blazor 的 WebAssembly 版本,所有这些东西。所以所有这些项目都像,嗯,使用这个会很棒,但是每次单独下载整个运行时到每个页面都非常慢。

每个浏览器都可以说,我们将提供并保持最新,作为我们二进制文件的一部分,或者只是从互联网上,或者在你下载它时,一个共享的 Python 运行时,一个共享的 Ruby 运行时,一个共享的 .NET 运行时等等。他们没有这样做。对吧?但是……

所有这些关于,嗯,网络前端太慢了,因为你必须下载所有这些东西的抱怨。就像,是的,你现在确实如此,但理论上,他们可以说,嗯,我们将支持像对这些二进制文件、你可能需要下载的 WebAssembly 运行时进行开放式管理一样。当然,你每次都必须下载的额外内容,比如 JavaScript,但 10 MB 的核心运行时,我们会像更新我们的浏览器一样更新它,或者只是在网络上更新它。我希望他们能这样做。是的,他们会的。

对吧?他们为 JavaScript 做了这件事。我的意思是,拜托。这听起来很疯狂,但与此同时,他们为 JavaScript 做了这件事,他们自己编写了。好的。他们甚至不需要自己编写。他们只需要允许运行其他人的代码。好的。

够了。让我们谈谈在浏览器中重新加载内容。相反,这听起来很有趣。所以我想要告诉你两个项目。一个是重量级的大型项目,它做了很多事情来帮助你编写 Web 应用程序。在编辑器中键入内容,并让这些内容神奇地发生变化。例如,默认情况下,如果我运行一个 Flask 应用程序,然后我转到

我运行它,然后我在浏览器中打开它,然后我看到我正在处理的页面。然后我转到并编辑 Jinja 模板。我点击保存,然后刷新浏览器。什么也没有发生。我必须回到 Flask 并重新启动 Flask。

回到浏览器,重新加载浏览器。现在我可以看到我的更改了。你可以通过转到 Flask 并说你正在进入错误模式来提高一个级别。因此,如果你看到任何更改,请重新运行 Flask 并重新加载模板。如果我编辑模板,那么你就可以编辑你的内容,保存它,转到你的浏览器,点击刷新,查看更改。但如果我可以让我的屏幕三分之二是我的编辑器,三分之一是我的浏览器,那会更好。当我键入时,

我看到页面上的内容正在发生变化。因此,如果我在某个东西上放置一个 CSS 类,我不必转到另一个应用程序并执行任何操作。它只是字面上的更改,大约每秒应用一次。对。

所以这就是这个重新加载功能的作用,但它做了很多事情。所以我想把它作为一种很酷的选择放在这里。我不确定我是否会立即推荐它。所以让我告诉你。例如,它不仅会执行我告诉你的操作,而且实际上还会重新运行每个函数。如果你更改了一个函数,它将重新运行它,你实际上可以进行实时分析。所以当你,

当你键入时,它会给你一个该内容的概要输出等等。因此,如果你想探索它,它会更广泛地提供这样的想法。所以它在那里工作。它带有一个 PyCharm 插件,这就是动画的作用。所以你实际上可以看到性能时间以及它如何运行和重新运行等的视觉表示。好的。所以这很整洁。它带有一个 AI 功能。我将跳过这个。我不知道那是什么,也不关心。它有……

是的,所以通常情况下,如果你更改了一个函数,它将重新执行当前函数,提供即时反馈。如果出现错误,它不会崩溃,它只会说,好吧,一旦你修复它,一切都会好起来的,它将开始再次工作。所以它对这一点很耐用,你知道吗?它将刷新整个项目中的文件,查看依赖项。因此,如果我更改了一点内容,那么它将更改其他内容,你知道,就像使用 do import 一样。对于 Django,

它完全按照我告诉你的那样做,就像你键入一样,不仅仅是你键入 HTML,而且是你键入 Python。所以他们在这里的示例是他们正在对所有对象进行查询,然后他们对其进行切片以进行限制,分页限制类型的事情。当他们更改 Python 中切片中的数字时,Web 浏览器会自动更新结果,而无需他们触摸它。

这很酷。是的,这很酷,对吧?同样对于 Flask,它会自动重新加载 Flask。但同样,它说,看,它将热重新加载 Flask 应用程序。但是,如果你只将 Flask debug 设置为 true,Flask 将已经这样做。你明白我的意思吗?所以它没有做的一件事是,它不会在你在一侧键入时刷新页面,右侧的内容不会更改,对吧?它做的另一件事是,对于 SQL Alchemy,因为它像一遍又一遍地运行函数一样,呃,

我开始插入、插入、插入到数据库中。所以它执行这些自动运行和回滚的事务,因此它不会调整数据库。哦,有趣。是的,它还对 pandas 进行热重新加载。因此,如果你正在处理你的数据框或类似的东西,它会在你键入时自动更新。好的,很有趣,对吧,Brian?是的。是的,我不知道我是否以前谈到过,但是由于人们可能想要一个不那么侵入性的版本,

所以我有一个名为 Server Hot Reload 的项目在 GitHub 上,它是一个 JavaScript 文件。如果你只在你的页面中包含 JavaScript 文件,它将为你提供相同的 Web 应用程序功能,该功能将重新加载模板。例如,如果你只在页面的顶部包含 JavaScript,然后在 Flask 中,如果你使用 Flask Debug 运行它,或者 Pyramid 在调试模式下自动重新加载,你可以在配置文件中设置它。我相信你也可以用 Django 做类似的事情。

然后你在一侧浏览,在另一侧编写代码,然后你开始键入。然后它就开始了。甚至对于文本,如果你正确设置它,它甚至会在你更改正在使用的图像等内容时重新加载页面。

超级酷。但是这个,它不会变得太疯狂。它不需要 IDE 插件和所有这些东西。基本上,它所做的是查看来自服务器的响应,并说,HTML 的哈希值是否已更改?如果是,则重新加载页面。如果它没有更改,则不要重新加载页面,等等。所以无论如何,要,

两种方法基本上可以在你的编辑器中工作,开始键入并拥有某种 Web 输出或其他地方的重新加载。所以它会在你键入时自动更改。所以你不必管理它。你就像,哦,这是什么类?哦,这看起来很棒。不,我们需要在这里添加更多填充。就这样。所以,服务器版本可能不会做,比如如果你更改了 Python,嗯,

从技术上讲,不会。它不会这样做。但是,如果你将 Flask 设置为自动执行此操作,然后它重新请求页面,那么是的,它会这样做。你明白我的意思吗?好的,明白了。如果你愿意使用框架工具,那么它会这样做。好的。

好的。非常好。酷。是的。好吧。这就是我们所有项目的全部内容,不是吗?是的,是的。那么,你还有什么额外内容吗?我有一个宠物

我的宠物项目,我想谈谈。所以完整的 PyTest 课程已经发布了一段时间了,关于它的一些事情有点,我真的很想改变。所以我正在进行一些更改。首先,如果你看到,如果你去看看,它说有 162 节课。这看起来有点吓人。原因是我把它都切成了,所以书中有 16 章。该课程涵盖了整本书。16 章,并且

我每个视频都涵盖一章的一部分,嗯,还有欢迎视频等等,这就是 162 的来源,但是,嗯,实际上有 162 个视频,这有点吓人,嗯,特别是如果你,如果你正在观看一个视频,并且你有点像,这里有很多内容,嗯,但是我的意思是,如果你喜欢一次只看几分钟,那

这很好。但有些人只想在一顿午餐休息时间或其他时间浏览整章内容。所以我正在处理的替代版本是将其分成章节。所以大多数章节将是一个视频。然后你可以,你可以,你知道,只是观看一个视频。你可以在一个周末或不是一个周末,大约 20 分钟内观看它。

有几章,第二章和第三章非常大,编写测试函数,然后是夹具,非常大的概念。所以它们有点长。所以我没有将其分成一个视频,而是分成三个视频。所以当我完成所有这些后,新版本将不是 162 节课,而是大约 20 节课。

然后我可能会将其设置为默认值,并且我会同时提供这两个版本,因为有些人可能更喜欢更精细的粒度,而我让这两个版本都存在并不需要更多努力。所以它们都会存在。无论如何,这就是我正在做的事情。酷。

是的,我喜欢小视频。我认为它是一种更好的参考材料。你不想不得不去想,在那个 18 分钟的视频中,我想要的东西在哪里?是的,这就是好处。另一件事是我喜欢,对于视频,我喜欢第一次可能将它们设置为 1.2 倍速或 1.3 倍速,或者 1.25,也许 1.4,以便快速获得概述。并且

你必须为每个视频重置它,这有点烦人。这很麻烦。是的。无论如何。这很麻烦。好吧,让我们看看我还有什么额外的东西。我有一个老掉牙的东西。这里有一些有趣的东西。所以有一个Hacker News的帖子或Reddit的帖子。我会选择Hacker News。我很确定它是Hacker News在讨论,嘿,能不能有人推荐……

一些很酷的、合法的程序员小说?对吧?就像我想要一本关于编程的间谍惊悚小说,但它不傻。对吧?它不像,“哇,这是VB6。我知道。我要追踪他们的IP。”你知道吗?它不是这样工作的。

更像《黑客军团》,而不是《侏罗纪公园》或其他什么。我不记得了。所以我认为非常酷的一本书,我要向Mark Russanovich致敬,他是Azure的CTO。显然我在2012年买了这本书,只是为了让你了解一下。所以它不是全新的,但它是一个超级酷的系列。只要记住它的计算机世界是2012年的。所以如果人们感兴趣的话,可以查看一下。另外,Windows上的Warp。我是Warp终端的忠实粉丝。

它运行得超级超级好。我尝试了ghost TT或ghost TD,或者无论你怎么说,我都做不到。我做不到。它甚至不允许你使用热键选择文本。它只是在那里放置像control H之类的东西。除非你可以像编辑器一样使用它,

我做不到。所以,我的意思是,我知道有一些方法,比如你可以按住shift和箭头键,但你不能像control shift箭头键那样逐词操作。你不能像,你可以使用home键,但你不能使用shift键。这些都很奇怪,就像编辑之类的东西,其中一些只是开始将转义字符放入其中。我,

我不记得确切是什么了,因为当我看到它时,我想,好吧,我们以后再回来处理这个。无论如何,如果你使用Windows并且正在寻找更好的终端,我知道Windows的终端选项比其他地方少,而且质量也差,原因有很多。比如有Windows Terminal,然后,我不知道,

还有其他什么吗?我不确定。肯定有一个命令提示符。好吧,PowerShell在Windows Terminal中运行。你可以运行Git Bash或PowerShell或任何类似DOS的东西。你可以在Windows Terminal中运行所有这些。哦,对了。对吧?你可以在Warp中做同样的事情。你可以选择,我想要PowerShell,我想要Git Bash还是其他什么。但是它最外层的部分,你知道,应用程序本身……

选项不多,所以这是一个很酷的东西,人们可以查看一下,我会链接到视频,因为它很有趣,但你可以直接访问warp.dev或其他地方,好吧,我们Teaching Python播客的朋友们,他们正在参与并成为PyCon 2025教育峰会的一部分,他们指出,嘿,嘿,申请将会……

或者,你知道,尽快提交提案。我认为那是上周五,今天是星期一。所以它刚刚开放,他们说主题是:在人工智能时代,我们如何保持创造力、同理心和批判性思维能力,这些能力使我们成为人类和优秀的程序员?我们想知道。所以有很多

围绕这个主题的想法。所以我们有Kelly、Sean和许多其他人参与其中。所以如果这与你产生共鸣,请查看一下。不,我只是在偷笑,因为即使在人工智能出现之前,据我所知,我们也没有解决这个问题。是的,我真的不知道答案。所以我将询问ChatGPT,我会回复你的。好的。

是的,这里还有一个额外的快速内容。我刚刚注意到Graneon,它为Python Bytes FM提供支持,顺便说一句,还有很多其他东西,刚刚发布了他们的2.0版本,就在七小时前。法语新闻怎么样?突发新闻。突发新闻。据我所知,这里有很多很酷的更改。一件不酷的事情是,据我所知,它不运行FastAPI应用程序。所以如果你有Graneon,

为你的Fast API应用程序提供支持,你可能需要在更新之前进行测试,CLI中也有一些重大更改,例如你如何指定某些约束等等,这很容易修复,因为它会告诉你这个约束等等,但我认为有一些事情正在发生,

至少在我切换到这个版本后,我所有的Fast API应用程序都停止工作了,但所有其他的应用程序,如Quart、Flask和Pyramid都运行良好。有趣。奇怪。不知道为什么。而Quart是异步优先的,就像FastAPI一样。所以我不知道发生了什么,但他们,他们没有接受它。所以我只是将版本固定在小于2的版本上,直到这里发生的事情得到解决。所以这是一个小小的PSA。好吧。就这样。七小时前,你已经尝试过了。

并非故意。它发布三小时后我就尝试了。我需要发布其他东西,但我的部署过程是将某些东西检入Git,然后让它重新构建Docker镜像并重新启动它们。就是这样。检查所有依赖项。有什么我们可以更新的吗?例如,Ubuntu是否有我们需要应用的安全修复程序?我们可以更新Web服务器吗,以防它有安全修复程序?然后我们将重新运行依赖项并重新启动它。然后它没有重新启动。我想,等等。什么?为什么?

这里发生了什么?这不好。所以我才知道Graneon有一个新版本。好吧。你知道我的意思吗?这不像我那样,“哦,我必须快速尝试一下。”它自己尝试了我,然后它并没有那么好。所以我赶紧修复了它。好的。明白了。是的。是的。

好的,笑话?- 我想要一个笑话。- 制表符还是空格。这个与制表符或空格有关。在讲笑话之前,我会先讲一个预备笑话,让大家进入状态。这就像一个糟糕的笑话,一个糟糕的喜剧演员,在你真正想看的喜剧演员之前出现。所以我们在PyCon,我不知道,

我认为这甚至可能是在波特兰。那是很久以前的事了。并且有一些公司显然对Python不太了解。他们只是一家编码公司,对吧?他们来向Python人员推销他们的编码工具。所以他们想制作一件辣味T恤,辣味T恤上写着:“制表符还是空格,战斗吧!”这是我在整个会议上见过的最愚蠢的T恤。

我的意思是,制表符基本上是被禁止的。它们并非完全被禁止,但它们几乎是被禁止的。这根本不是一个论点。结束了。你就像,你试图把它设定为一场辩论。我说,你可以使用两个空格、四个空格来战斗,但你不能在Python会议上使用制表符与空格进行战斗。是的。

无论如何,人们仍然穿着那些T恤。我想我有一件用来割草的。好的。好吧,关于这个话题,两个空格还是四个空格?四个。除非我正在使用JavaScript,那么是两个,因为出于某种原因,该工具似乎默认为JavaScript使用两个空格。你呢?通常是四个,但我注意到我也经常使用两个。好的。非常反叛。好的。你是一个包裹在模糊云朵中的谜团。好的。好的。

这个怎么样,这是真正的笑话。我不知道这更好还是更糟,但这就是人们想要的。代码双关语。准备好了吗,Brian?是的。一个Python程序员走进酒吧并打开一个标签页。酒保告诉他们坐在桌子旁,因为他们需要四个空格。这就是我为你们准备的。不,太搞笑了。看,这就是人们收听的原因。是的。

是的,是的,是的。哦,不,我好像在糟糕地宣传它。太搞笑了,伙计。好笑话。现在,这里实际上还有更多。我们以前谈论过这个地方,对吧?是的。让我们看看。它们并不都很好。为什么for循环停止运行?它休息了一下。是的。你怎么安慰一个JavaScript错误?你控制台它,就像console log等等。就是这样。不,很好。谢谢。太搞笑了。我知道。我听到了缺陷。不,不是真的。

但这就是我带来的东西。再次和你交谈很高兴。感谢大家收听。是的,当然。再见。