Pyrefly和Ty:比较两个新的Rust驱动的Python类型检查工具
来自Meta的Pyrefly和来自Astral的Ty以Rust的速度为Python代码库提供类型检查。
Python最新一波第三方工具最引人注目的是,它们不是用Python编写的。相反,许多用于项目管理、代码格式以及现在类型检查的较新的工具都是用Rust编写的。
这不是对Python的轻描法;每种语言都有它的位置。但现代语言工具需要一个实时反馈循环,Python并不总是能以所需的速度提供。Rust来填补了那个空白。得益于Rust,像uv这样的现代项目管理工具和像ruff代码格式化工具运行得又快又精益。
The newest projects in this space aim to provide type-checking tools for Python that are faster and potentially more powerful than Python-based tools like mypyand pyright.
来自Astral的Ty(uv软件包管理器和ruff代码格式化程序的制造商)和来自Meta的Pyrefly基本上具有相同的用例:为Python提供高速类型检查和语言服务。两者都具有类似的性能,运行速度比基于Python的类似项目快很多倍。本文告诉您这些新工具目前在可用性和功能方面的位置。
Pyrefly
Pyrefly不是Meta的第一个Python类型检查工具。此前,该公司交付了用OCaml编写的Pyre。此后,Pyre已经退役;用Rust从头开始写的Pyrefly取代了它。
在现有的Python代码库上开箱即用运行Pyrefly,您通常会在第一次遇到大量错误。如果您使用命令pyrefly check --suppress-errors,所有标记的错误都将通过特殊解释的评论在您的源中被抑制。然后,您可以有选择地删除这些抑制,并运行pyrefly check --remove-unused-ignores来清理代码库。这允许您逐步迁移未键入的代码库。
Pyrefly, like all modern Python tooling, uses pyproject.toml to store its project-level configuration data. You can also add per-directory configurations with standalone pyrefly.toml projects that use the same syntax. Or, you can provide directory-specific overrides for options in a single config file.
林特错误类型的列表与mypy和Pyright可以处理的列表相当。从两个工具迁移都很容易,因为Pyrefly可以自动完成。就Pyright而言,错误检查设置几乎有一个一对一的映射,所以更改不会太刺耳。
对于处于早期阶段的项目来说,Pyrefly已经感觉充实了。详细的文档、VS代码扩展,甚至您可以尝试的在线沙盒都在这里。如果您正在使用uv工具,您可以运行uvx pyrefly在代码库上进行实验,而无需安装任何东西。请注意,这会导致uv用作Python的虚拟环境提供程序,因此如果您为项目使用不同的venv,它可能会产生虚假错误。
Ty
Astral的ty项目也仍处于早期阶段,这一点很明显。它的文档不像Pyrefly那样充实,其功能集也不那么令人印象深刻。公平地说,该项目最近才公开,而且确实处于早期阶段。
You can install Ty from pip or run it from uvx. It intelligently detects a source directory in a pyproject.toml-configured project, so it doesn’t mistakenly chew through Python files in your project’s virtual environment. But its configuration options are more minimal than Pyrefly’s; for instance, excluding files from checks is done via .gitignore or other external files rather than from configuration rules.
Ty的检查文件规则集似乎比Pyrefly或现有工具更精简,尽管它涵盖了其他地方找不到的一些情况。例如,虽然它不检查异步错误,但Ty确实会检测类定义是否对__slots__有冲突的用法,尽管前者似乎比后者更常见。
尽管处于早期阶段,但ty已经确定了两个关键特征。它与语言服务器协议兼容,并提供VS代码扩展来利用它。另一个优点——一个足够重要的,可以尽早地呼吁这一点——是其错误报告中的细节水平。Pyrefly的错误报告了行号和错误类型,但ty调用的错误类似于您在现代Python的上下文详细错误消息中看到的错误。
结论
由于两个工具之间的性能竞争环境,Pyrefly是更直接有用的项目。Pyrefly提供更广泛的现有功能集、更好的文档和工具,以允许从其他类型检查器进行优雅迁移,并加入现有代码库。也就是说,ty正处于早期阶段,因此一旦这两个工具离开各自的alpha和beta阶段,就值得回到这两个工具。