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阶段,就值得回到这两个工具。

相关文章

java是编译型还是解释性语言(java是编译型语言吗)

Java 语言在实现上结合了编译和解释两种方式,但更准确地说: Java 是先编译成字节码,然后由 JVM 解释或即时编译(JIT)执行的语言。 Java 的执行流程概览:1、源代码(.java 文件...

一文讲清Python语言的应用与实践(python语言的运用)

摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。Python不仅语法简洁、易于上手,而且功能强大,几乎可以胜任各种类型的编程任务。本文将从“Pytho...

新手学Python避坑,学习效率狂飙! 三、Python 数据类型

Python 是一种动态类型语言,在使用变量时不需要显式声明数据类型,变量的数据类型会在赋值时根据赋值的值自动确定。以下是 Python 中主要的数据类型及相关避坑分享:一、数字类型1、整数(int)...

Python自动化办公学习笔记11——布尔类型、变量赋值、类型转换

1. 布尔类型(Boolean)在Python中,布尔类型是整数类型的子类,其中`True`表示"真"或"是",`False`表示"假"或"否&...

Python 中Typing,你了解多少(python trie)

Typing是一个功能强大的内置 Python 模块,它为类型提示提供运行时支持。可以强制 Python 在运行时进行类型检查。在了解模块的作用 typing 之前,需要了解动态和静态类型的编程语言。...

小白学python经常会有这三个认知错误

引言很多 python初学者,经常会有这个或那个的理解问题,大部分集中在语法层面,不理解为什么或者如何写。但本文主要讲三个认知上的错误,并不是语法层面的。在我接触的初学者中,这三个认知一直是他们所困惑...