您好,欢迎收听 Python Bytes,我们将直接为您和我的耳机提供 Python 新闻和头条新闻。这是 2025 年 1 月 21 日录制的第 417 集。我是 Brian Ocken。我是 Michael Kennedy。我们今天很高兴能做这个节目。没有什么能让我们沮丧。所以……
但在我们开始之前,我要感谢所有通过 TalkPython 培训、PythonTest.com、课程、购买我的书、我们的 Patreon 支持者(当然,你们很棒)以及过去赞助我们的许多赞助商来支持我们的人,我们也爱他们。但我们也热爱直接支持我们的人。
如果您想向我们发送主题,请通过我们的网站上的联系表单进行发送,您也可以通过 Blue Sky 或 Mastodon 向我们发送,这些链接都在节目说明中。如果您正在收听,感谢您,也请与朋友分享。如果您想在某个时间加入我们的直播,请查看 pythonbytes.fm/live 以查看下一集的发布时间。
拍摄和录制。您可以加入我们并在我们直播时发表评论。还要感谢订阅电子邮件通讯的人。如果您访问 pythonbytes.fm,您也可以在那里订阅并直接在收件箱中获取所有主题的列表,这样您就不必再去查找它们了。
是的,我们正在稍微改进这种格式,试图进行更深入的分析,但也使其易于浏览。是的,这是一个巨大的资源。我认为这很棒。是的,人们也收听,但将其记录在一个地方也很不错。我们每周都会涵盖许多很棒的主题。本周我们的第一个主题是什么,Michael?第一个主题是 LLM 捕获器。这个名字并不能很好地描述它实际的功能,但事情是这样的。呃,
我相信每个人现在都做过这件事。我知道我最近做过,因为我当时正在对着 Bodo 3 API 大喊大叫,因为没有什么比一点小小的 Bodo、自动生成的、没有注释、没有文档、不知道要输入什么参数更令人沮丧的了。无论如何,您可能会将这些错误传递给 LLM 并说,请,亲爱的聊天、副驾驶、人类,等等,这里发生了什么?我错过了什么,对吧?而且
它非常有用。但这个项目有点不同。它就像通往这类事情的网关。所以您会得到以下内容。如果发生崩溃,显然您会有堆栈跟踪或回溯,具体取决于您使用的语言以及您如何表达。他们在这里将其描述为调试中默默无闻的罪魁祸首。
当您可以让 LLM 捕获器承担繁重的工作时,为什么要与神秘的错误消息墙搏斗呢?所以事情是这样的。基本上,我会在这里向下滚动到某个地方。您可以做的是在您的 try accept 块中,您可以说,您知道,给定一个异常,diagnoser.diagnose 传递异常,它会将这些详细信息传递给各种 LLM 并说,帮助我理解这一点并打印出一条消息,向我展示如何修复它,而不仅仅是回溯。好吗?好的。
所以我不知道我是否能找到任何。我对这个感到兴奋。是的,我认为它非常棒。但我不会在生产中使用它,尽管您可以使用。如果您希望您的日志包含有关实际发生情况的消息,它就是您的调试助手。因此,您可以做的是在本地运行 Ollama,这是默认设置。或者,如果您提供您的 OpenAI API 密钥,它可以将其传递给您在
中可能拥有的任何级别的模型。如果您能拥有一个迷你模型或类似的东西,在 ChatGPT 上进行诊断,那就太棒了。所以有一些不同的模型可以一起工作,但基本上,当它遇到异常时,它会说,
嘿,我正在使用 fast API 处理这件事,我遇到了这个异常。帮我弄清楚发生了什么。因此,Olama 版本是本地免费的,只需运行您的机器版本即可,Open AI。好吧,我们都知道 chat GPT,对吧?所以您可以将其作为装饰器放在函数上。您可以在 try accept 块中手动执行此操作,或者甚至可以注册一个全局异常处理程序。因此,每当发生全局异常时,它就会被
捕获到您的系统中,它会对其进行诊断。它具有异步和异步 API,您可以通过环境变量进行设置。因此,它向您展示了如何为 Ollama 下载 QWEN 2.5 编码器模型,这非常出色。就这样。看看那个。所以您有您的 diagnoser.catch 在一个有风险的函数上,或者在您的 tracestep 块中,您只需说 diagnose 或 async diagnose。
因为它会运行一段时间。它将进行本地或到 chat CPT 的 API 调用。因此,您不希望它一定阻塞您的系统。您只需进行一个小的 async await。砰。它就开始了。是的,就是这样。您可以获得格式化或未格式化的信息。因此,如果您需要纯文本才能进入某种 JSON 字段,您可以这样做。或者您可以使用正确的格式使其更易于阅读。你怎么看,Brian?是的。
在尝试之后,我将保留对它的判断。是的,您甚至可以指定温度,也就是您希望模型应用于您的分析的创造力。这很有趣。是的,这是一件 Open AI 的事情。我喜欢它,在任何异常情况下,只需上传我的整个代码库并重写我的代码以修复错误即可。没错。不要诊断它,只需修复它即可。只需修复它,伙计。我为什么还要在这里碍事呢?
是的,所以看看它。是的,您甚至可以执行 ChatGPT 的完整 O1 模型,这就像真正、真正……那是 200 美元的那个吗?那是 20 美元的那个,但您每周只能调用 50 次。所以错误不多。如果您获得 200 美元的那个,那么您可以全天候调用它。是的,我希望人们获得 200 美元的那个,将其放入您的 CI 中并在所有 Python 版本上执行它,以便我们只需填满所有……
然后我们将收到一条公告:“哦,整个西海岸停电了,因为我们破坏了电网。”是的,但无论如何,我认为这很有趣。只需插入即可。是的,它看起来可能很有趣。这是 Pat 推荐的。Pat,感谢您发送此信息。Pat Decker。哦,Pat 在这里。谢谢,Pat。是的。
好吧,我有点想谈谈不好的软件包。就像没有圣诞礼物给他们,或者发生了什么?是的,没有包装纸。不。
实际上,我们正在谈论包装。我想谈谈 Python 包索引和恶意软件。让我们向下滚动到这里。有一篇安全和安全工程师第一年回顾的文章。这是 Mike Fiedler 写的。他谈到了很多事情,但他谈到的一件事是隔离。这在 8 月份发布,但我才刚刚赶上。
所以就像他们感染了 COVID 或发生了什么一样。不,这是,这是,你知道的,就像不好的软件包一样。所以如果有人说,你知道的,有一个,有一个,有一个恶意软件在一个,在一个软件包中不应该存在。我们该如何处理它?他们过去喜欢有调查它的选项,然后将其删除,但这只是让整个事情消失。但是,有一个新的流程,他们最近在 12 月底写了关于它的文章。而且,它被称为项目隔离,而且,
而且,我们链接到一篇文章,它真正谈到了这一点。因此,如果您担心恶意软件包并且您对 PyPI 的工作原理感到好奇,请查看一下。我不会详细介绍整个过程。但是,这确实很有趣。所以我们的想法是,如果我们跳回到像未来的改进自动化一样,希望我们会有某种自动化的方法。但是,比方说,几个人报告说一个软件包中包含恶意软件。
PyPI 的管理员可以继续使用某种石蕊试验来说,或者更确切地说,快速地说,让我们控制住这种情况。隔离不会删除整个内容。它会将,有一个 API,一个简单的 API,管理员可以进入并说,嘿,我们将隔离这个项目。然后软件包进入隔离状态。在那时,有很多,
很多事情会发生。呃,它不可安装,但所有者仍然可以看到它。只有所有者可以,可以进行,嗯,我不知道他们是否可以进行更改,但是是的,在隔离期间它不可修改,但他们可以看到发生了什么。管理员可以查看它,嗯,并确定那里是否真的存在恶意软件,并且可能
有可能,你知道的,我们可能有一些不良行为者报告软件包。所以我们不希望人们因为生气或其他原因而报告正常的东西并删除东西,但这还没有发生。所以这个,这个,这个已经存在一段时间了。查看统计数据,它已经,让我们看看,自 8 月份以来,他们已经实施了这项措施。有 140 个已报告的软件包。
它们已被隔离,其中只有一个离开了隔离状态。这是因为为什么那里有混淆的代码?那么这是违反 PI 可接受使用策略的行为。联系了项目所有者。他们修复了它,因为我想他们没有意识到你不能这样做。真的很有趣。我不知道这是一个策略。是的。
是的。好吧,我的意思是,它应该是。如果你想运送一些你,我知道有些公司会喜欢,我们想混淆我们的代码,但我们仍然想让它可用,但我们不会通过 PyPI 来做。我想不要通过 PyPI 来做。好的。我不想混淆代码。我理解这主要是一个隐藏的恶意软件,对吧?是的,他们会有一个 base 64 编码的字符串或其他东西,然后他们会对其进行解码并执行它并平衡它。是的。
所以,是的,有一个……
是的。创建了一些外联模板。因此,完整的流程,如果您感到困惑,或者如果您有,这是一个,如果您收到管理员的通知,说您的一个软件包不在隔离状态,很好。他们可能会将您指向此处,但您知道,请查看一下。我认为我很高兴他们正在努力解决这个问题,我们正在为 pipey I 管理员处理问题创造更轻松的环境,但也为每个人使用创造更安全的环境。所以这很好。是的,非常好。好吧,
好吧,我知道你肯定知道这一点,Brian。测试。测试使您的代码更安全。是的,我最近完全接受了异步生活方式。你知道的,我谈到了重写 Python 和 Cort,Flask 的异步版本,我写了一篇关于它的博客文章,并在节目中提到了它
我敢肯定。但是您将如何调用 API?我现在正在处理一些项目,这些项目都是关于调用 API 的。我就像,哦,我的天哪,这么多 API,这个调用那个,你知道的,等等。如果您能够异步地执行此操作,那就太好了。我会说,也许最好的,我喜欢 requests,但我现在想要异步故事的是 HTTPX,它具有与
requests 基本相同,并非完全相同,但非常相似的行为和 API 模式,但也具有异步变体,您可以创建异步客户端,然后等待所有调用,这很棒。所以您可能想测试它,即使是异步的,因为您将代码作为异步运行。所以我想向大家介绍 R ESP x,就像 response x 一样,这可能是我发音的方式,我不知道,无论如何。
R-E-S-P-X。它所做的是允许您模拟 HTTPX 请求。超级超级简单,无论您喜欢什么方式。例如,如果我想进行一个调用,我说 HTTPX get,并且我想确保如果该 URL 出现,它将返回某个特定值,例如 204,您只需说 resp.sql。
使用相同函数调用和值。然后您只需说 .mock 并设置您希望它执行的值或行为。就这样。这很酷。是的,如果您想那样做,它也可以作为 PyTest 插件。然后您只需说 rest mock .whatever 并调用函数。然后这里的所有示例都像……
第一行,模拟它。第二行,调用它。但您可能正在测试某个函数,然后该函数在内部使用 HTTPS,例如通过同步块。有很多层需要处理。因此,这将是一个更现实的示例。您调用模拟,然后调用您的代码,然后发生某些事情。这很酷。您甚至可以使用 mark。它对我的这个 PyTest.mark 语句有意义。我们在做什么?是的。
你的意思是?好的,您有 PyTest 使用 RESPX 标记它。因此,该项目定义了一个自定义标记,并且它传递了 foo.bar 的基本 URL。是的,您不必,我想,说基本 URL,对吧?对,因为您只是将其传递进去。因为它真的没那么糟糕,将变量传递到 VAR 通过标记并不难。
这就是正在发生的事情。所以您在这里使用您的标记进行预先准备。好的。太棒了。然后传递固定装置。好的,酷。就是这样。关于它没有什么好说的。但是,如果您需要模拟 HTTPX,而不是使用通用模拟内容,您可以使用此库,该库基本上与 HTTPX 具有完全相同的 API。很酷。有时我会忘记并非每个人都完全内化了我书的全部内容,但是……
好吧,我们可以努力。我们可以努力。我学到了新东西。哦,真的吗?你知道吗?如果您,我认为如果这是您的下一个主题,我也对此一无所知。所以我要学习一些新东西。好的。好吧,这实际上是 Rodrigo 也学到了一些新东西,因为他将其标记为今天的 TIL。我学到了。我喜欢人们发布 TIL,但我,
我个人认为您不需要在前面加上今天的 TIL。如果您只有一篇简短的博客文章,请发布它。我喜欢简短的文章。无论如何,所以使用自定义对象解包关键字参数或 K-Kwargs。我通常只说关键字参数。你说 Kwargs 吗?我是 K-W-Args。K-W-Args。好的。但我知道人们说 Kwargs,但我不知道。听起来像我在说克林贡语或其他什么。我不这样做。
是的。嗯,它让我想起了深空九号的软木塞,但是,嗯,使用自定义对象解包关键字参数。假设您有,呃,所以有一些解包,我们正在谈论,呃,星号或双星号或 splat splat 或双 splat,无论您想怎么说。嗯,假设您有一个字典,嗯,呃,并且您想将字典的内容作为参数传递给函数或其他内容。嗯,
我们经常使用它来使用字典进行双星操作,它将其解包为函数调用的关键字参数,这很酷。或者您可以这样做。这是一个使用它合并两个字典的示例。我不这样做,我通常不会这样做太多,但是很酷。
很酷,您可以这样做。现在有一种较新的语法,我们也对字典使用管道,这与之相同。现在有三四种方法可以做到这一点。是的,因为在 Python 中,应该有一种显而易见的方法……如果没有,则有四种。除非是字符串,否则有六种。好的。所以有很多时候,使用这个双星解包非常酷且方便。而且
但是如果您有自定义对象,而不是字典,如果您有自己的对象,您想要什么?你如何处理?你能做到吗?是的,你可以。所有这些都是这个小 TIL 的内容。您只需将 keys 函数添加到您的对象或类中即可。keys 函数需要或方法需要返回一个间隔。在这种情况下,例如,列表就是一个间隔,而且
然后是示例,他有一个哈利波特类。嗯,它返回了名字、中间名和姓氏。嗯,然后是一个 get item,嗯,大概它接受一个键,嗯,并返回某些内容。嗯,这就是您所需要的。然后您可以,呃,您可以执行此双 splat 操作,它就可以工作了。哦,太棒了。而且,呃,这个例子也很好,只是为了提醒大家,嗯,
当您执行 get item 时,请使用带有键错误的 else 子句。因此,如果人们传递了错误的东西,他们会得到相应的异常。无论如何,谢谢。是的,我喜欢它。非常非常酷。
好吧,我想就是这样。我觉得你很额外,我能看得出来。我确实感觉很额外。我比正常的事情多了很多额外的东西。所以让我们开始吧。让我们开始吧。在 pythontest.com 上,哦,几件事。我会倒着说。首先,我终于修复了它。我为 Twitter 设置了 X,而我不再使用 Twitter 了。所以我用蓝天图标替换了它。也在我的……
联系表单现在有蓝天了。所以我修复了这些东西。另外,我的播客内容不正确。所以我修复了我的播客数据测试代码以及字节等。当然。无论如何,这不是我真正想谈论的。我想谈论的是顶级高测试插件。我一直在为测试代码第二季研究这里面的很多东西。我依靠
使用此数据,我依靠顶级 PyPI 软件包。这是一个极好的资源,它使用 BigQuery。创建者 Hugo 刚刚写了一篇关于此的文章。
他写了一篇关于这里发生了什么的文章。关于 PyPI 的 BigQuery 数据的一件令人惊讶的事情,它很有趣,也是令人兴奋的消息。有趣的是,他正在使用 Google Big Cloud 或 BigQuery 内容的免费版本。
无论您需要 Google 帐户,您都会获得一些 BigQuery 查询,如果您做得太多,他们会将您踢出去,因此,呃,起初他从 4000 个项目开始,然后他增加到 5000 个项目,然后是 8000 个项目,但还有更多,所以他就像,好吧,我想知道我能做多少,所以这是一个他经历的小测试,我要跳到……
结果。结果是,他增加到
尝试了一百万个软件包,但没有一百万个软件包,但它返回了 531,000 个软件包。它与仅执行一个 30 天的软件包相同,处理的字节数相同。所以没关系。它变成了,结果表明,软件包的数量对 tick 查询没有多大关系,它是什么,是日期范围。所以如果,
如果他做了 5 天,它比 15 天便宜得多,比 30 天便宜得多。它是相对线性的。所以看起来他要做的是改变它,以便我们获得大量软件包数据,尽可能多地获得 531,000 个。但他可能也会以较小的方式报告这一点。
较小的块,因为很多人喜欢,或者其他什么。是的。但是很多人不想看到 531,000 个顶级,顶级 8000 个可能就足够了。我必须放大才能一次看到所有内容。所以我很兴奋,因为当我使用时,我正在使用 8000 个数据集和顶级高测试软件包,目前在顶级 8000 个中共有 133 个。我想有一个更大的列表。是的,
嗯,如果我有前 10,000 个或 20,000 个,我可能可以得到一个更大的软件包列表。无论如何。所以,呃,就是这样。这只是一件有趣的事情。如果您正在处理 BigQuery 数据,您可以,呃,日期是价格的主要影响因素,对吧?因为它可能计算每天或每个下载的下载次数。而,你知道的,如果只有 500,000 个软件包,就是这样,但是
还有比软件包更多的下载量。- 另一件事,是的,另一件事可能会改变的是,我认为将会改变的是,过滤仅 pip 软件包的成本更高,现在我们得到了很多 UV。
使用 UV 从 PyPI 下载内容的人。所以他想也包括这一点。所以它可能会,我认为他会改变它,以便数据来自所有内容,而不仅仅是 pip。这说得通。是的,绝对说得通。是的。无论如何。太棒了。酷。你有什么额外的东西吗?我有。不多,但让我们开始吧。在 pythontest.com 上,哦,几件事。我会倒着说。首先,我终于修复了它。我为 Twitter 设置了 X,而我不再使用 Twitter 了。所以我用蓝天图标替换了它。也在我的……
联系表单现在有蓝天了。所以我修复了这些东西。另外,我的播客内容不正确。所以我修复了我的播客数据测试代码以及字节等。当然。无论如何,这不是我真正想谈论的。我想谈论的是顶级高测试插件。我一直在为测试代码第二季研究这里面的很多东西。我依靠
使用此数据,我依靠顶级 PyPI 软件包。这是一个极好的资源,它使用 BigQuery。创建者 Hugo 刚刚写了一篇关于此的文章。
他写了一篇关于这里发生了什么的文章。关于 PyPI 的 BigQuery 数据的一件令人惊讶的事情,它很有趣,也是令人兴奋的消息。有趣的是,他正在使用 Google Big Cloud 或 BigQuery 内容的免费版本。
无论您需要 Google 帐户,您都会获得一些 BigQuery 查询,如果您做得太多,他们会将您踢出去,因此,呃,起初他从 4000 个项目开始,然后他增加到 5000 个项目,然后是 8000 个项目,但还有更多,所以他就像,好吧,我想知道我能做多少,所以这是一个他经历的小测试,我要跳到……
结果。结果是,他增加到