Pyrefly 是一款快速的 Python 类型检查器,计划在 2025 年底取代 Meta 现有的 Pyre 类型检查器。

Pyrefly 旨在通过 IDE 功能和检查 Python 代码来提高开发速度。

主要特点:

  • 类型推断:除了函数参数之外,Pyrefly 可以在大多数位置推断类型。它可以推断变量的类型和返回类型。
  • Flow Types:Pyrefly 可以理解程序的控制流以细化静态类型。
  • 增量性:Pyrefly 旨在实现模块级的大规模增量性,并优化检查和并行性。
 

Pyrefly:Python 的快速类型检查器和 IDE

 

目前正在积极开发中,存在已知问题。如果您发现错误,请提交问题。

 

Pyrefly 是一款快速的 Python 类型检查器。它计划在 2025 年底取代 Meta 现有的 Pyre 类型检查器。本 README 介绍了 Pyrefly 的基本用法。完整文档及代码检查工具请访问Pyrefly 网站。

 

入门

 

Pyrefly 旨在通过 IDE 功能和检查 Python 代码来提高开发速度。

 
  • 在浏览器中尝试 pyrefly:沙盒
  • 获取命令行工具:pip install pyrefly
  • 获取 VSCode 扩展: 链接
 

主要特点:

 
  • 类型推断:除了函数参数之外,Pyrefly 可以在大多数位置推断类型。它可以推断变量的类型和返回类型。
  • 流类型:Pyrefly 可以理解程序的控制流以细化静态类型。
  • 增量性:Pyrefly 旨在实现模块级的大规模增量性,并优化检查和并行性。
 

参与其中

 

如果您有任何问题或想要报告错误,请 创建问题

 

请参阅我们的 贡献指南 以获取有关如何为 Pyrefly 做出贡献的信息。

 

选择

 

编写 Python 类型检查器时有很多选择。我们从Pyre1、 Pyright和 MyPy中汲取了灵感。以下是一些值得注意的选择:

 
  • 除了函数的参数外,我们在大多数地方都会推断类型。我们确实会推断变量和返回值的类型。例如, def foo(x): return True的结果等同于你写的def foo(x: Any) -> bool: ...
  • 我们首先尝试推断[]它的使用类型,然后再进行修复。例如,xs = []; xs.append(1); xs.append("")我们会推断出“ xs: List[int]然后”在最后一条语句上出错。
  • 我们使用流类型来细化静态类型,例如,x: int = 4既知道x具有类型int,而且紧接着的下一次使用x也会知道类型是Literal[4]
  • 我们的目标是实现大规模增量(在模块级别)并通过并行性进行优化检查,旨在利用 Rust 的优势使代码更简单一些。
  • 我们期望模块具有大型强连接组件,并且不会尝试利用源代码中的 DAG 形状。
 

设计

 

设计中有很多细微之处会定期发生变化。但构建棋盘格的基本原理涉及三个步骤:

 
  1. 弄清楚每个模块导出的内容。这需要import * 传递性地解决所有语句。
  2. 对于每个独立的模块,将其转换为绑定,处理所有语句和范围信息(静态和流)。
  3. 解决这些绑定,可能需要解决其他模块中的绑定。
 

如果我们遇到不可知的信息(例如递归),我们会Type::Var插入占位符,稍后再填充。

 

对于每个模块,我们按顺序完整地解决各个步骤。具体来说,我们不会像 Rosyln或 TypeScript那样首先尝试解决某个特定的标识符,也不会使用细粒度的增量式方法(例如Rust Analyzer 使用Salsa)。相反,我们追求的是原始性能和更简单的以模块为中心的设计——如果解决模块中的所有绑定足够快,就无需单独解决单个绑定。

 

绑定示例

 

给定程序:

 
1: x: int = 4
2: print(x)
 
 

我们可能会产生以下绑定:

 
  • define int@0=from builtins import int
  • define x@1=4: int@0
  • use x@2=x@1
  • anon @2=print(x@2)
  • export x=x@2
 

值得注意的是:

 
  • 关键在于诸如define(某事物的定义)、use(某事物的用法)和anon(我们需要进行类型检查但不关心其结果的语句)之类的东西。
  • 在许多情况下,一个键的值指的是其他键。
  • export一些键是通过键和import 值从其他模块导入的。
  • 为了消除标识符的歧义,我们使用它们出现的文本位置(在我使用的示例中@line,但实际上它是文件中的字节偏移量)。
 

示例Var

 

给定程序:

 
1: x = 1
2: while test():
3:     x = x
4: print(x)
 
 

我们最终得到了以下绑定:

 
  • x@1=1
  • x@3=phi(x@1, x@3)
  • x@4=phi(x@1, x@3)
 

表达式phi是两个值的连接点,例如phi(int, str) 。我们忽略和int | str之间的区别,因为在本例中没有必要。defineuse

 

在求解过程中,x@3我们会遇到递归。操作上:

 
  • 我们开始解决x@3
  • 那就需要我们去解决x@1
  • 我们解决的x@1Literal[1]
  • 我们开始求解x@3。但我们目前正在求解x@3,所以我们发明一个新的Var(我们称之为?1)并返回 。
  • 我们得出结论,x@3一定是的Literal[1] | ?1
  • 由于是?1由引入的,x@3我们记录为?1 = Literal[1] | ?1。我们可以取其可达上限,并得出结论 ?1 = Literal[1]
  • 我们简化x@3为仅仅Literal[1]
 

相关推荐

mark.js

mark.js

前端实现搜索文本高亮的技术,十分简单易用,明了. mark.js 是一个用 JavaScript 编写的文本高亮器。它可以用来动态标记搜索词或自定义正则表达式,并提供一些内置选项,例如变音符号支持、单词搜索、自定义同义词、iframe 支持、自定义过滤器、精度定义、自定义元素、自定义类名等等。

GSAP

GSAP

GSAP 是一个强大的 JavaScript 工具集,可以将开发人员变成动画超级英雄。构建适用于所有主流浏览器的高性能动画。动画化 CSS、SVG、画布、React、Vue、WebGL、颜色、字符串、运动路径、通用对象……任何 JavaScript 可以触及的东西! GSAP 的 ScrollTrigger 插件可让您使用最少的代码创建令人惊叹的基于滚动的动画。

augment code

augment code

Code 是一款面向团队的开发者 AI,它将您组织的专业知识和实践融入到每一次交互中。我们将您团队的集体编码知识放在您指尖,帮助每位开发人员更智能、更快速地工作。 Augment 是一个开发者 AI 平台,它能够理解您的代码库,帮助您理解代码、调试问题并加快交付速度。使用聊天、下一步编辑和代码补全功能,您可以完成更多工作。

Firebase Studio

Firebase Studio

集成Google基础设施的AI编程工具,支持一键构建前端、后端和移动应用,覆盖从开发到发布的全流程。 结合了类似Lovable、Cursor、Replit的功能,内置数据监控能力,适合快速部署和迭代。X用户称其为“Lovable+Cursor+Replit”的综合体,受到开发者关注。

trae.ai

trae.ai

Trae是字节跳动推出的一款免费AI编程工具,它集成了Claude3.5和GPT-4o等主流AI 模型,旨在为开发者打造一个全方位的智能编程环境。 Trae,致力于成为真正的 AI 工程师(The Real Al Engineer)。Trae 旗下的 AI IDE 产品,以智能生产力为核心,无缝融入你的开发流程,与你默契配合,更高质量、高效率完成每一个任务。

n8n

n8n

n8n帮助你将任何具有API的应用程序与任何其他应用程序连接起来,并在很少或没有代码的情况下操作其数据,完成工作流自动化。

Codex CLI

Codex CLI

一款轻量级终端运行编码智能体 —— Codex CLI,该工具现已在 GitHub 完全开源。是OpenAI开发的。 Codex CLI 可以直接在用户的计算机上工作,旨在最大化 o3 和 o4-mini 等模型的推理能力,并即将支持 GPT-4.1 等额外的 API 模型。 Codex CLI 可以在 macOS 12+、Ubuntu 20.04+/Debian 10+、Windows 11 的 WSL2 子系统中使用,要求最少拥有 4GB 内存(建议 8GB)。