Ruff is a Python tooling tool that can replace Flake8, isort, and Black, offering over 700 rules for linting and formatting. It is built using Rust, making it significantly faster than traditional Python tools. Ruff simplifies the toolchain by bundling multiple functionalities into one tool, reducing the need to learn and manage multiple disparate tools.
UV is a Rust-based tool that serves as a faster alternative to pip, pip-tools, and virtualenv. It uses a global cache to store packages, reducing disk space and speeding up installations through symlinking and copy-on-write techniques. While it is not as abstracted as tools like Poetry or PDM, it provides a more performant and unified experience for managing Python dependencies and environments.
Rust was chosen for its speed and performance benefits, which are crucial for improving the efficiency of Python tooling. The trend of using Rust in other programming ecosystems, such as JavaScript, inspired its adoption. Rust's ability to integrate with Python allows for the creation of faster and more robust tools, addressing the performance bottlenecks in traditional Python toolchains.
Astral is a venture-backed company founded by Charlie Marsh, focused on building high-performance Python tooling. Its mission is to create unified and faster Python tools, such as Ruff and UV, and to bring more innovation and experimentation into the Python ecosystem. Astral aims to provide a cohesive experience where users can bootstrap Python and access all necessary tools from a single binary.
UV uses a global cache to store packages, which allows it to link the same package across multiple projects instead of downloading or copying it repeatedly. This approach, using symlinking and copy-on-write, significantly reduces installation time and disk space usage. It contrasts with pip's caching mechanism, which often involves redundant downloads and storage of packages.
Astral plans to expand UV's capabilities to include bootstrapping and managing Python versions, allowing users to download and install Python directly through UV. This feature aims to simplify the process of setting up Python environments and ensure compatibility with the required Python versions for projects. Additionally, Astral is focusing on improving editor integrations and making the UV roadmap more public for community feedback.
Ruff includes a built-in formatter called Ruff Format, which is largely compatible with Black. While it does not aim to innovate on code style, it focuses on providing a faster and more unified experience. Users can configure Ruff to handle both linting and formatting, reducing the need to learn and manage separate tools like Black and Flake8.
Charlie Marsh faced a steep learning curve transitioning into the Python open-source community, as he had not previously been an active participant. He had to learn how to be a maintainer, engage in PEP discussions, and build relationships within the ecosystem. This shift was a significant change from his previous roles as a Python user in various companies.
Astral currently does not generate revenue and is venture-backed. The company plans to build services on top of its open-source tools, such as private package hosting or CI/CD solutions, that integrate seamlessly with Ruff and UV. These services will remain optional, ensuring that the core tools stay open source and free for all users.
UV stands for 'ultraviolet,' which ties into Astral's branding by referencing light and celestial themes. The name was chosen for its brevity and ease of typing, as it is short and located near the home row on keyboards. Unlike Ruff, which predates Astral, UV was intentionally named to align with the company's brand identity.
Charlie Marsh 和他的团队正在使用 Rust 来使 Python 工具更快。Ruff 可以替代 Flake8、isort 和 Black,以及更多其他工具。uv 可以替代 pip、pip-tools 和 virtualenv。Astral 是 Charlie 的风险投资支持的公司,而他们拥有的 ruff 和 uv 只是开始。由于 uv 是最新的工具,因此讨论中有很多内容都深入探讨了 uv。链接:ruffAstraluv 学习 pytestpytest 是 Python 的首屈一指的测试框架。使用 Hello, pytest! 快速学习基础知识。之后,您可以通过 The Complete pytest Course 成为 pytest 专家。这两个课程都在 courses.pythontest.com</context> <raw_text>0 今天我们与 Charlie Marsh 讨论 Ruff、Astral 和 UV。主要关于 UV,这是一个可以替代 pip、pip tools 和 virtualenv 的工具。由于它是用 Rust 编写的,所以速度非常快。这在 Charlie 和 Astral 的工作中是一个主题,即使用 Rust 来加快 Python 工具链的速度。如果您只偶尔使用 pip 或创建虚拟环境,这可能不是什么大问题。但是,如果您经常这样做,就像我一样,这些速度提升会改善我的日常工作流程。
欢迎收听 Test & Code。本期节目由 HelloPyTest(学习 PyTest 的最快方法)和 Python Test 社区赞助播出。更多信息请访问 courses.pythontest.com。
今天在 Python Test 节目中,我邀请了 Charlie Marsh,我请他来谈谈 UV,但我有点想谈谈……实际上,我甚至不知道 UV 的发音,所以我们就从这里开始,然后稍微谈谈 Ruff 和 Astral。所以,Charlie,首先,你如何发音?是的,UV 就对了。不,UV 就对了。你的第一反应是正确的。别担心。好的。让我们稍微回顾一下。是的。Ruff 甚至不算太旧。所以……
请告诉我从 Ruff 的构思到现在的简短版本。是的,当然。好吧,我认为我在 2022 年夏天开始着手 Ruff 的开发。我的意思是,你可以查看提交历史记录,但我认为我进行第一次发布是在一年半前,也许吧。
在那时,我最近的工作是在一家计算生物技术公司担任软件工程师。我主要负责我们的软件基础设施。因为我们正在进行科学计算,所以我们有很多 Python 代码。我刚刚花了很多时间研究我们的工具链。这包括代码分析器、格式化程序、类型检查器,以及打包工具,
当我离开那份工作时,我脑子里有了一个想法,我们能否通过利用 Rust 来构建更快的 Python 工具?因为这是我在其他一些编程生态系统中看到的东西。例如,这是 JavaScript 生态系统中正在发生的一种趋势。我开始接触 Rust 以及 Rust 和 Python 可以一起使用的方式。
在那份工作中,以及在我们正在做的一些事情的过程中。所以 Ruff 的开始是我离开工作后,为了非常具体地检验这个假设:我们能否构建更好的 Python 工具,它会是什么样子?在我发布的第一个版本中,
它非常简陋。我认为它支持,我应该回头看看,但我认为它支持大约 20 条规则。所以它可以解析 Python 源代码。它可以遍历它。它可以做一些事情,比如查找未使用的导入。所以它可以进行一些分析。但我真的专注于,我相信这不会变得慢得多吗?这样你就可以构建执行许多相同操作但速度快得多的工具。这就是我想证明的事情。
我认为我在 2022 年 8 月发布了它。它发展得非常非常快。事实证明,很多人关心这个问题,并且更快速、更高效的 Python 工具的想法确实引起了他们的共鸣。所以我们有一些非常早期的采用者的重要项目,例如 Pydantic 和 FastAPI。
和 Zulip。所以,你知道,这给了项目很大的动力。从那时起,我就想,
我要看看所有阻止人们使用它的东西,然后逐一解决它们。我们只是不断扩大项目的范围,使其能够做越来越多的工作。在过去的一年中,它一直在快速发展。请继续。好吧,当我开始关注它时,对我来说,它有点像,
它做了一些 flake8 做的事情,一些 flake8 light……我的意思是 flake8 没有插件……是的,是的……但是它超级快,所以我甚至喜欢它这一点,但它远不止于此,即使在首页上也写着“与 flake8、isort 和 black 完全兼容”,但这只是触及了表面,不是吗?是的,我们有大约……
我不知道,大约 700 条规则。所以它可以用来……我们经常看到人们迁移时,他们用 ROUGH 替换了 10 或 20 个工具。这意味着他们可以获得……ROUGH 的主要功能
我开始开发它的原因是性能。但事实证明,还有很多其他事情,有些是有意的,有些是偶然的,也使它对人们非常有吸引力。其中之一是我们将更多东西捆绑在一起的事实。因此,您可以学习这个工具,并将这个工具放入您的
项目中,您的工具链中,而不是学习一堆不同的工具并弄清楚如何将它们链接在一起。因此,与其学习如何使用 iSort(这是一个很棒的项目),不如将 iSort 规则添加到您的 rough 配置中,对很多人来说,这种简化非常非常有用。所以是的,我们随着时间的推移添加了很多东西。我们发布了……
对格式化的支持,所以我们有一个很大程度上与 black 兼容的内置格式化程序 rough format,我认为我们在 10 月份发布了它……所以是几个月前……而且……它遵循了相同的……你知道,相同的原则,它就像 black 那样……
它非常流行。我们目前并不一定试图在代码风格上进行创新。我们试图做的是构建一些我们认为是……构建一些更高效的东西,以及对人们来说感觉更统一的东西。因此,与其学习代码分析器和格式化程序,他们可以使用 rough,rough 可以成为您的代码分析器和格式化程序,感觉很熟悉。好的。就是这样。但这如何成为一家公司?
所以我创办了这家公司。该公司名为 Astral。我们的目标是构建统一、高性能的 Python 工具。我在去年 PyCon 之前宣布了这家公司,所以是在 4 月份。我们想要做的一部分是……
为 Python 工具注入更多活力和实验性。甚至让不从事 Python 工作的人也来,说服他们来构建许多优秀的 Python 工具。这些都是我们非常有意的目标。
从那时起,我们扩大了团队规模。我想截至今天我们有 8 个人。我们显然从事 Ruff 的开发和维护工作,现在也从事 UV 的开发和维护工作。我们未来的目标是……我们希望继续构建这种统一的工具。我们的梦想是您下载这个单一的二进制文件,
它为您引导并安装 Python,然后为您提供进行 Python 开发所需的一切。因此,UV 是其中一些核心打包基础,例如安装和管理依赖项的方法。ROUGH 就像代码分析器和格式化程序。我们希望将所有这些整合到一个连贯的体验中。从那里……
在工具之上构建和销售服务,这些服务与之非常完美地集成。使用 Python 并已经使用我们的工具时,您自然会需要的下一件事。所以我打算把它推迟到以后,但既然我们都在这里,那就构建和销售围绕它的额外工具吧。我本来想把它推迟到以后,但既然我们都在这里,那就构建和销售围绕它的额外工具吧。
所有这些工作到目前为止都是开源的。你们是如何赚钱的?我们现在不赚钱。我们是所谓的营收前公司。我们不赚钱。我们是风险投资支持的。我们有投资者向公司投资,以换取所有权股份。我们的愿景是构建这个工具,然后……
将其用作人们的切入点,以及构建和销售与之非常完美集成的软件的一种方式。就像,你知道,在这个世界里,我们所有的东西都保持开源和免费,而且没有人需要为我们正在做的任何事情付费。但是,你知道,希望我们能够在工具之上构建服务
我不知道我们是否真的会做这些,但例子包括,哦,一个自定义的,我们可以做像包托管这样的事情,例如为已经为此付费的公司提供私有注册表。它们托管在 AWS 或其他地方,我们可以构建我们自己的版本,对吧?例如,这与我们的包管理器非常完美地集成,或者我们可以构建与 rough 和我们构建的其他工具非常完美集成的 CI/CD 解决方案。
但那里的想法是,尝试构建一些东西,如果你已经在使用我们的工具并且与它们非常完美地集成,那么这些东西就能真正发挥作用。所以我们想要的激励机制是,我们希望有动力去以一种非常整体和真诚的方式发展、投资和构建开源,并将其转化为,你知道,为我们工具的企业用户提供的服务,这些服务与之非常完美地集成。
是的,我可以想象。好吧,你没有问我,但我可以想象将来,一部分将是一个咨询部门,让……你知道,一家公司说,这就是我们现在正在做的。我不在乎它做什么,但你能让它更快吗?是的,这也是可能的。是的,是的,是的。
但这有点像……你知道,我没有……我很乐意谈论公司如何运作等等。就像,我只是不经常谈论它,因为我认为这并不一定是什么人们感兴趣的,但就像,我,这有点像……这有点像我们的目标,对吧?就像,我们正在使用……我们现在的目标是构建和投资开源。然后我认为这会为我们可以在其之上构建的东西或……你知道,为工具的企业用户创造非常有趣的机会。是的。
好吧,是的,主要是因为,部分原因是我今天早上想到一个笑话。我只是很好奇,在你的公司里,如果你谈论你的财务前景,那些是不是星象预测。
是的。我确实有一个名为“星象预测”的电子表格。是的。是的。太棒了。是的。我们 2024 年预算的电子表格名为“星象预测”。是的。谢谢你。我很高兴你想到了这一点。实际上,我不知道我是否曾经告诉过任何人,即使是在内部,但我确实自己也说过这个笑话。好的。很好。是的。我们很好。这太疯狂了。这是一年,就像一年前一样。
你一年前的生活和你一年半前的生活非常不同。哦,它完全不同。是的。一年半前,我的意思是……好吧,我也当了父亲。所以这也很不一样。但一年半前……我的意思是,我的整个职业生涯……我一直是 Python 用户很长时间了。或者我不知道。我年纪不算大,我想。但我的整个职业生涯,我都在使用 Python 的公司工作。我在可汗学院。
我们在 App Engine 上。都是 Python。然后我最近所在的公司,也就是我之前提到的计算生物技术公司。那也是全部 Python。所以我一直是 Python 用户很长时间了,但我根本不是社区的一员。我也不是真的……
涉及开源,对吧?再说一次,我一直是开源的消费者,但不是真正的积极参与者。所以对我来说,过去一年半以来最大的变化之一是,一年半前我根本不认识任何 Python 人。我必须真正成长和学习,你知道,显然是如何成为一名维护者,因为现在我们有这些项目,你知道,谢天谢地,有很多活动。所以这有点像一种实践学习,学习如何成为一名优秀的维护者或合格的维护者。
然后另一个是学习,结识 Python 生态系统中的所有人并学习
PEP 流程是如何运作的。现在我实际上有望参与 PEP。我的人们希望我在 Python 讨论论坛上发表意见。这对我来说都是非常非常新的事情。所以它完全不同。是的,我的生活与一年半前的生活非常非常不同。好吧,公司负责人,你还编程吗?是的。是的,很多。好的。是的,这……
说实话,这需要很多……是的,我的意思是,我有很多其他的责任,比如……你知道,首先是对在公司工作的人,确保他们得到支持,并且
你知道,薪资发放正常,一切正常,法律,所有这些事情。这只是很多责任,招聘,招募。但我试图……我想我对我自己的时间安排做了一些有趣的事情。例如,我试图只在星期二和星期四开会。然后这会为……星期三创造很多空间,我们不开任何会。所以我可以……我只是试图集中大量的时间。
如果我们继续发展,我不知道我是否能够永远编程,除非我非常努力地将此作为我的优先事项。但现在,是的,我……这可能是我尝试利用大部分时间做的事情。好的,让我们来谈谈 UV。所以 UV 是……它是一个……它是 pip、pip tools 和 virtualenv。是的,完全正确。是的。这是……
我们在 PyCon 上开始讨论这样做。所以大约一年前,我们开始在内部讨论这件事。当时只有我们三个人。我知道我想做这样的事情。我认为打包可能是我们正在做的事情中非常重要的一部分,因为我认为……这是一个人们感到沮丧或我看到沮丧的领域……我认为至少有机会做一些不同的事情,所以我们开始讨论这件事,大约一年前,我们就像……到我们这样的细节程度,我们就像也许这就是第一个版本的发布,这就是第二个版本的发布等等,等等,但发生的事情是……rough……
它只需要我们花费大量的时间。我们决定做格式化程序等等。所以我们直到 10 月份才真正开始着手这项工作。
它旨在成为 pip/tools/virtualenv 的有效替代品。我不会说……如果节目的听众熟悉 Poetry 或 PDM,它现在还达不到那种抽象级别。这些工具带有相当有主见的流程,您需要执行 Poetry Add、Poetry Lock、Poetry Sync。
在我看来,pip 和 pip tools 处于较低的控制级别。当您使用 pip 时,您正在执行诸如添加此内容、安装此内容、删除此内容之类的低级命令。这就是我们开始的级别。所以如果您现在经常使用 pip 或 pip tools 或 virtualenv,UV 的设计初衷就是您可以直接使用它来代替这些工具。所以它,你知道,就像 rough 一样,它是一个试图做多件事的单一工具,这样你就可以
专注于学习该界面,而不是将一堆不同的工具链接在一起。而且,像 Ruff 一样,我们设计的整个工具都尽可能快。所以从一开始,性能就是一个非常重要的关注点。我们做出的许多选择都是由如何才能使这些东西比目前存在的其他东西快 10 倍来驱动的?
所以我对结果感到非常满意。它非常非常非常快。而且有一些
有一些它不快的地方。我对我们想要在未来采取的方向有一些想法,试图继续改变事物并使其更快。但是,例如,如果您需要在您的机器上构建 NumPy 才能安装它,那么使用 UV 的速度与使用 pip 的速度一样慢,因为我们没有
我们没有使构建 NumPy 更快,但是……你知道,如果它……我想我甚至不知道发生了什么,如果我执行 pip install numpy,它有时会在客户端机器上构建,所以这取决于……在 Python 中,实际上有两种……“工件”,它们被……上传到 PyPI,所以当你 pip……这些是
源代码分发和构建分发。Python 中的构建分发通常称为 wheel。因此,如果您曾经见过 .WHL 或听说过 wheel,实际上发生的事情是,作为……让我们说我是 NumPy 维护者。我不是,但想象一下我是。
当我将我的 NumPy 版本上传到 PyPI 时,我也可以在许多目标架构上预先构建它。所以我可以说,我将为 Windows、Mac 和 Linux 构建一个版本,我可以将这些预构建的文件上传到 PyPI。
然后,如果您使用 Windows 并尝试 pip install NumPy,它会查看,他们是否已经上传了为我的机器构建的版本?如果存在兼容版本,它将提取该版本,并且不需要构建。如果您使用的机器没有上传兼容版本,那么您的机器实际上必须构建它。
从源代码构建它。这就是为什么有时当您安装东西时,它们可能会失败,看起来像是,哦,您缺少本机依赖项。失败的原因有很多。但实际上,有时当您在 Python 中安装东西时,您必须自己构建它们。有时您不需要。
从源代码构建它。这就是为什么有时当您在 Python 中安装东西时,您必须自己构建它们。有时您不需要。
如果您必须自己构建某些东西,那么很难让它快得多,因为这基本上完全不受 BIP 或 UV 等工具控制的事情。因此,如果您需要在您的机器上从源代码编译 NumPy,那么速度将相同。但是我们做了很多巧妙的事情来尽量减少这项工作,尽量减少您必须构建它的次数。
是的,完全正确,所以……我认为我们可以考虑做一些有趣的事情,但是……不是让 gcc 更快,而是……我们如何在更多地方利用构建工件……但是……
但是当我们在 Python bytes 上介绍这个时,一位评论者说
他们正在研究 UV 正在做的事情。您正在做的事情中有一件与……非常不同的事情,那就是它与……的缓存方法非常不同,是的……PIP 使用的方法。所以你明白吗?你能描述一下吗?是的,我可以描述我们的缓存是如何工作的。我不能很好地描述 PIP 的缓存,但我认为我可以描述一些我认为我们做到的而他们没有做到的东西。我还……
所以基本上,理解 UV 缓存的方法是,我们拥有一组全局存储,其中包含您在任何项目中安装的所有包。如果您在两个不同的项目中安装相同的依赖项,
我们通常会做的是,与其重新下载该内容并将其复制到两个不同项目中的虚拟环境中,我们将其放在一个地方。然后我们使用各种形式的符号链接和这个名为“写时复制”的东西,这与符号链接略有不同,但您可以将其视为类似的东西。但实际上,如果您有两个项目需要 Flask 或需要 requests,
我们将拥有一个我们存储在缓存中的版本。然后当我们将其安装到这些项目中时,我们可以直接链接它,而不是复制所有工件或重新下载它或任何其他操作。所以这有很多好处。首先,它非常非常快,因为创建这些符号链接比复制项目多次或您可能必须执行的其他操作快得多。另一个是它更节省空间,因为您不再需要在每个项目中存储 requests 的单独副本。您基本上只存储一个副本,然后从所有需要它的项目链接到它。这些是主要好处,真的。它是速度和磁盘空间效率。
所以它也使我的虚拟环境更轻量级,对吧?它应该更轻量级。是的。是的。所以它很有趣,因为我认为这些事情……是的,我和一些 pip 维护者谈过,我认为这些事情是 pip 维护者
普遍感兴趣的事情。其他一些包管理器和其他生态系统也做了一些类似的事情。例如,在 JavaScript 生态系统中,有一些包管理器使用类似的方法运行。这就是一些灵感的来源。但一件很酷的事情可能是我们发布了这种缓存方法
我们可能会对用户进行一些规范化,这可能会……而且,我们必须解决与之相关的某些技术问题,实际上可以使 pip 未来更容易发布类似的东西,我认为这是一个很酷的结果,因为……
我当然希望每个人都使用 UV,但 PIP 也是生态系统中的一个基础项目,我估计有数百万甚至数百万人在使用它。所以对我来说,思考我们所做的事情很有趣,它们如何被反向移植,或者它们如何稍微改变现状并使 PIP 也能够引入其中的一些内容。是的。好吧,所以,好的,UV,这个名字从何而来?嗯……
好吧,它是紫外线的缩写。好的。我们想要一些……它不是根据那部电影命名的,对吧?不。什么电影?好的。我没有做我的研究。不,不是。好的。我们喜欢它。我们想要一些非常短的东西。就像,这也是我对 Ruff 深思熟虑的事情。就像,我们正在构建人们经常键入的工具
人们经常键入其名称的工具。所以像 rough 一样,我的意思是,实际上我不知道我的打字姿势是否良好,但是当我键入 rough 时,我只需要使用我的两个食指,它非常容易键入。很容易想出一些实际上很难键入的酷炫名称。但是当我选择名称时,我确实会考虑这样的事情,我想,键入起来感觉如何?因为如果它成功了,我们将一遍又一遍地键入它。所以像,
我喜欢 UV,因为它非常短,而且就在主行旁边。对。所以它很容易键入。也是食指。是的,也是食指。所以我想让它易于键入且与众不同。我还想,你知道,我们还想让它与 Astral 品牌更相关,因为 rough
rough 早于 astral,所以 rough 这个名字,它实际上没有……rough 和公司名称 astral 之间没有主题一致性,但对于 uv 来说,至少在紫外线和 astral 之间存在某种联系,至少如果你眯着眼睛模糊地看的话,所以我不希望它成为某种东西,我希望它成为感觉更具凝聚力的事情
所以 rough 是缩写吗?它像 Rust Fest formatter 之类的东西吗?不,它实际上没有任何意义。是的,更像是我看了一堆单词,然后我想,我在这里能造什么词?然后我想,rough,像 rust 一样,像
无论如何,我不知道。所以是的,rough 没有任何意义。不,不。我喜欢它是一个双关语,就像它是一个粗糙的图一样。那是我当时对自己说的话。哦,不错。是的。在早期,我有一些关于这方面的笑话,但我已经不再说了。
所以让我感到惊讶的一件事是,有一些事情让我对 VUV 感到惊讶。好的方面和不好的方面都有,我想没有什么负面的。如果它是负面的,也没关系,顺便说一下。我相信你已经听说了,但是发布的数量,这就像一周前或类似的事情,或者也许是两周。是的。
它存在的时间不长。是的,一周半,我认为。我认为我们做到了。我认为那是上周的星期四。是的。好的。上周。是的,不是上周,而是前一周,对吧?是的。有很多版本。有很多版本,这很酷。但是那是?
处理起来一定有点困难,还是你只是很高兴?有多少核心人员,你的公司有 8 个人,每个人都在做这个吗?不,不。好吧,发布后的那一周,
我们敞开了大门,是否有人愿意来帮助我们?因为我们有很多问题,或者有很多活动。所以我们有几个人。总的来说,大约有四个人在从事 UV 的工作。其余的人则从事 Ruff 和围绕 Ruff 的相关项目,例如我们的编辑器集成等等。
我们发布了很多版本。这肯定会慢下来。我的意思是,这有点像 rough 的早期。rough 的早期对用户来说更糟糕。因为有时我会一天发布两次,因为有人想要某些东西,我会决定,为什么不把它发布出去呢?现在的情况是,拥有用户非常令人振奋,因为我们……
你知道我们在私有仓库里开发这个东西已经几个月了,我们做了一堆测试之类的事情,但仅仅拥有用户是非常非常不同的,因为首先,看到人们真正尝试你的东西是令人振奋的;其次,如果他们尝试了并且遇到了问题,那很可能是一个我们不知道的真实错误,对吧?或者我们没有看到,所以能够参与到这样的反馈循环中是很好的:
有人尝试你的项目,他们遇到了一些问题,你修复了它,然后他们就有了良好的体验,因为他们尝试了新版本,而且一切正常。所以一部分原因是拥有用户并再次进入持续发布东西的模式令人振奋。一旦项目稳定下来,我们肯定会大大降低这个速度。
GitHub 显示你有 48 位贡献者。所以你们公司以外的人也在为它做贡献,对吧?是的,是的。那也是在一周内的事。是的。是的。不,因为我们发布的时候,可能只有五位贡献者,也许四五位。所以这些都是新的。是的。但发布一周后,你们就有 231 个未解决的问题了。这压力大吗?
你已经习惯了吗?不。因为 Ruff 有 681 个。不,我已经习惯了。不是说——不,不,不。没关系。有很多问题并不一定不好。我的意思是,问题意味着人们正在使用它,对吧?好的。所以如果我们的问题比收到的少,我认为我会担心人们并没有真正使用它。至少我是这么想的。
但我认为我不太担心,因为我们知道大部分工作是什么样的。我们知道我们需要做什么,这只是需要努力完成很多工作。我们关闭了我想超过 200 个问题,在一周内。
在一周内。现在我想是 150 多个,因为它是一个滚动的计数。但我们关闭了很多东西。是的,现在有 544 个已关闭的问题。是的,我想发布后的一周,压力确实很大。我们确实有很多事情想修复。所以我们基本上只是试图快速修复它们。
所以让我感到棘手的是 virtualenv 使用提示符 . 不显示,无法正常工作。这个问题已经解决了。——我认为我们已经解决了。——在我们注意到之前我们就解决了。它只是没有。——我没有解决这个问题。其他人解决了,但是的,我认为它很快就被解决了。——然后是 pip list,我甚至不知道 pip。我通常不使用 pip freeze。所以我使用了 pip list。所以 pip freeze 立即就工作了。
pip list,呃,list 现在已经发布了,我想是的,就在几个小时前,是的,是的,那是贡献者做的,是的,嗯,是的,所以我们正在修复,我的意思是,我确实想要,我的意思是,我确实想要这个项目感觉像,你知道的,当我们发布一些东西时,我们显然非常努力地工作过,但是
它仍然有点像项目的开始,而不是结束。所以我们应该——有很多错误。但我希望产品的感受应该是越来越好,越来越陡峭。每次我们关闭一个问题并修复一个错误时,
这只会使项目更好更强大。所以过去一周的重点就是正确性和修复问题。不过,围绕它的一些问题是因为 Ruff 是新的。这是一个新的名字。人们并不期望它会是什么。由于 UV 使用 UVPIP 和 UVVNV,而且我不每天都使用 PIP tools,所以我不知道 PIP tools 的 UV 命令是什么。
我们只使用 UV pip compile UV 空格,空格 compile。是的。但因为你使用了它,我认为很多人都在期待他们最喜欢的角落功能能够工作。这并不是一开始的目标。而且我,这甚至是你的目标吗?你并没有试图做到 100% 兼容,是吗?不,我们没有,我们没有试图做到 100% 兼容,但我们正在努力做到很大程度上兼容,并且像,为了,
那里的意图,我们已经收到了很多关于这方面的正面和建设性反馈
有些人认为它非常有意义并且非常喜欢它。有些人认为它令人困惑并且不喜欢它。我们正在努力弄清楚我们对它的感觉。但是使用 pip 作为子命令的意图确实是为了立即了解 CLI 的外观、应该支持哪些命令以及人们应该如何使用它。如果我们有自己的 uvinstall 命令,
也许我们最终会添加它。但这几乎可以做任何事情。
就像 poetry 有一个 poetry install 命令。这与 pip 的 pip install 命令非常不同。它们只是以非常不同的语义运行,并且意味着非常不同的东西。所以那里的意图只是试图立即传达,好的,如果你运行 uv-pip install requests,它会将 requests 安装到当前的虚拟环境中。这是我希望子命令能够立即传达的内容。
目标不是支持 pip 的每一个标志,例如。尽管我们确实支持
我们支持很多,但我们不会支持所有。而且我认为我们不会支持每个子命令。目标更多的是传达界面的范围以及它通常是如何工作的。所以我们这么做了。但是的,它并没有在后台使用 pip 或 vm 或任何类似的东西,我想这是另一个潜在混淆的来源。但其中一件事是——所以我一直在关注 pip list 线程。
你的一条评论是,人们是否以编程方式使用 pip list?输出需要相同吗?或者它可以是其他东西?你一直在关注这个线程。好的。是的。我不知道结果是什么。你决定了吗?我们做了同样的事情。是的,我们做了同样的事情。你知道,问问它是否兼容。是的,我们做了与 pip 相同的事情。是的。好的。因为有些人可能会把它放到 pip 中。
工具链或其他什么东西。是的,我认为没有——我没有充分的理由偏离它。但我们这么做的部分原因是,顺便说一句,
而不是使用 uv install,对,我们有像 uv pip install 一样,我们这么做的主要原因是因为我们想在未来添加可能位于顶层的命令,所以我们可能会在未来添加 uv install,但如果我们添加它,它的工作方式将与 pip install 完全不同,所以我们想保留空间,基本上在顶层
在未来添加这个更武断的工作流程。因此,我们将所有内容的范围都限定在这些子命令之下,这意味着我们将来不必破坏它们。如果我们添加我们自己的 UV install,我们仍然可以使用这些命令。所以这是另一个动机。
我看到了一些反弹,至少从一些人的场外来看,就像你说的,有些人说,也许你不应该使用 PIP 这个词。是的。但也有,一家风险投资支持的公司接管这些项目是否公平?是的。
我对此有自己的看法。但在我说任何话之前,你考虑过这个问题吗?这是一个需要考虑的问题吗?嗯,我认为如果这就是那里可能暗示的内容,我会反对我们接管 PIP 的想法。因为在我看来……
我认为也许至少可以利用一些,一些,所以如果,既然有 UV,如果有人想为一个项目做贡献,他们可能会考虑为 UV 做贡献,而不是为 PIP 做贡献,或者只是说,我不需要做贡献,因为他们有钱可以支付。
好吧,我想要的是——而且我真的认为可以——我们的项目与其他开源项目之间存在共生关系,即使它们有时被视为竞争的或可替代的。例如,这与 Ruff 和 Pylent 类似。
我们与 pilot 项目有良好的关系。例如,我们赞助了一位维护者。如果我们需要更改我们的 pilot 规则,我们通常会与他们讨论。或者如果他们要向 pilot 添加规则,工具之间通常会有对话。在我看来,部分原因是
首先,很多人使用 Pylint。许多使用 Roth 的人也将其与 Pylint 一起使用。所以我希望工具和工具生态系统能够健康发展。所以我的目标或我们的目标不是完全取代 Pylint,因为有很多项目将继续使用 Pylint,并且正在使用 Pylint。所以我希望有一个好的……
这些项目之间的生态系统,因为我认为它们在某种程度上是共生的。而且与,老实说,与 pip 类似。我们还可以做的一件事是,我们可以带来,你知道的,因为我们是一个比较新的项目,我们不必
太费力地思考——比如,pip 和 UV,我们的目标有很多重叠之处,但也有一些非常不同的目标。比如,pip 必须非常稳定。pip 的主要目标是它需要极其稳定。对不起,我不应该代表这个项目发言。但我对这个项目的印象以及与维护者的谈话是,那里的主要目标是它需要非常稳定可靠。它甚至需要经常为非常旧的东西工作。它需要工作。
对我们来说,我们可以做出不同的权衡。我们可以选择支持某些东西,而我们在周围的位置不同。所以我们可以尝试一些事情,也许这甚至会反馈到 PIV 中。但我们也可以为许多打包讨论带来不同的视角。我实际上认为,如果 Python 生态系统有多个可行的包安装程序,这是一件好事。
它们都围绕着一组共享标准。我认为这对生态系统来说实际上是一件非常健康的事情。所以我不确定,至少从我的角度来看,以一种非常真诚的方式,我希望我们正在做的工作与 Python 生态系统中的其他项目之间存在共生关系。同样,这不是我做得很好的一件事
到目前为止,但我认为这对我们来说实际上非常重要,那就是我们需要确保我们的项目不受公司成功的束缚。
对吧?因为,还有很多其他开源项目做得非常好。但是拥有一个存在于公司之外的治理模型等等,即使公司不存在,这也是我经常思考的事情。所以,我不知道。我没有回答,我正在尝试,我认为我正在回答你的问题,但我正在通过传达我至少是如何看待这种关系来进行。而且
嗯,我希望这对 Python 生态系统来说只会是一件好事,会有更多这样的工具,以及更多可以花时间在这些工具上的人,但我完全理解它不是……它确实会产生……你知道的,它可能会产生紧张关系,是的,是的,到目前为止,我通过 GitHub 问题看到的互动以及
而且我认为在 Mastodon 上的帖子,甚至包括你和 Astral 中参与该项目的其他人,似乎都尊重社区中已经存在的人。我没有,我没有其他证据来怀疑你。所以,到目前为止,你们看起来像好公民。我很感激。我很感激。那是你的印象。因为这肯定是我自己的感受。我的意思是,像,
Pip 就像,我不知道,至少在我看来,至少像,
一个非常了不起的项目。我非常尊重维护和参与该项目的人。这基本上是我的观点。我并不是说这个项目不好,而我们的更好。它们只是不同的项目。再说一次,我认为对于 Python 生态系统来说,拥有多个可行且围绕一组共享标准构建的安装程序是一件好事。而且我认为参与 pip 工作的人也会同意这一点。
但是是的,我想就此更广泛地说的一点是,我确实普遍感到……我认为像我这样的人,或者一家公司,有可能进来构建一堆 Python 中的东西,并以……
一种不……尊重社区的方式,并且不像与社区真正融合的方式,首先我不想那样,而且我也没有那样感觉,而且我也非常感激,因为我认为 Python 社区……总的来说,非常热情,我觉得……
我不知道。这就是我的感受。就像我说的,一年前半我并不认识这个社区中的任何人,而且我一直感受到很多……
积极性、尊重和……来自我几乎所有互动的良好意图,所以我很幸运情况如此,因为我也认为有一个世界,我们进来时人们真的非常生气和敌对,而且……根本不是我所经历的,所以……我不知道,我觉得很幸运,我的意思是,也许不是每个人都很好,但像,你知道的,总的来说,几乎每个人都非常友善,所以
我很高兴我们有这样的动态。重要的是我们,你知道的,我们,我们以同样的方式比较自己。酷。Astro 的下一步是什么?哦,天哪。哦,我的意思是,现在的重点是尽可能多地修复问题。
这是一个重点。你们还会接管更多工具。我们可能在至少几年后会看到你们发布的其他东西。是的,我的意思是,从这里开始,我希望 UV 的路线图……
非常公开。我相信我们将来还会进行一些项目,这些项目会在几个月内保密,然后我们发布它们,或者其他什么。但这并不是我偏好的工作方式。我认为这样做有充分的理由。但我更希望我们的 UV 路线图至少现在更公开,我们可以公开地勾勒出它,并在公开场合获得反馈。这些都是非常好的事情。我认为我们接下来想做的事情
嗯,至少对于 UV 来说,或者可能是我接下来要做的事情是,我们想添加对
引导和管理你的 Python 版本的支持。如果你以前使用过像 PyEmp 之类的东西——我试过。是的,或者我相信你——或者如果你为此使用 Homebrew,有很多不同的方法来管理如何安装 Python。Conda 也是这个问题的答案。有很多不同的方法可以安装 Python。
但我希望 UV 能够为你安装 Python,特别是不同版本的 Python。你可以想象你只是下载了 UV,然后你对你的项目运行 UV pip install,它实际上会下载并安装 Python,然后下载所有依赖项。
你不必担心,我该如何安装 Python,或者我是否拥有正确的 Python 版本?我希望 UV 也能够管理这一点。所以这可能是我们接下来要开始做的下一个主要功能,我认为。但这不会是本周。然后在粗略方面,有一些——我的意思是,我不知道。
我选择分享和不分享的东西,我认为这始终是关于管理期望的问题。因为我们想要做的一些事情需要很长时间。我不想让人们说,哦,他们会做 x。但我认为我确实想在粗略方面做的一件事是,我们想更多地投资我们的编辑器集成。所以我们有一个语言服务器为我们的 VS Code 扩展提供支持。
我们认为如果我们基本上——该语言服务器是用 Python 编写的。但由于各种原因,我们想用 Rust 重写它,并使其成为 Ruff 本身的一部分。因为现在,它就像一个单独的东西,它会调用 Ruff。但如果它内置于 Ruff 中,我们就可以围绕
服务器中的持久状态,使其更强大,使其能够一次分析多个文件。所以更多地投资编辑器集成是今年的另一件大事。这很酷。
是的。我今年的任务清单之一就是尝试调查 Ruff 中的更多选项,因为它比一年前能做的事情多得多。是的。是的,这很酷。好吧,非常感谢你的时间,Charlie。是的,我们稍后再聊。太棒了。非常感谢。
感谢您的收听,并感谢所有通过购买课程支持节目的所有人,包括 Hello PyTest(学习 PyTest 的最快方法)和完整的 PyTest 课程(如果您想真正成为 PyTest 专家)。两者都可以在 courses.pythontest.com 上获得,您也可以在那里加入 Python 测试社区。现在就到这里。现在去测试一些东西吧。