pylyzer ⚡
pylyzer
是一个用Rust编写的Python静态代码分析器/语言服务器。
安装
pip
pip install pylyzer
cargo(Rust包管理器)
cargo install pylyzer --locked
从源码构建
git clone https://github.com/mtshiba/pylyzer.git
cargo install --path . --locked
确保cargo/rustc
是最新版本,因为pylyzer可能使用了最新的语言特性。
GitHub发布版本
相比pylint、pyright、pytype等工具有什么优势?
- 性能 🌟
平均而言,pylyzer检查Python脚本的速度比pytype和pyright快__100多倍__1。这主要是因为pylyzer是用Rust实现的。
- 报告可读性 📖
与pytype/pyright难以阅读的错误报告相比,pylyzer清晰地显示了错误发生的位置,并提供了清晰的错误消息。
pylyzer 😃
pyright 🙃
- 丰富的LSP支持 📝
作为语言服务器,pylyzer支持各种功能,如代码补全和重命名(该语言服务器是对Erg语言服务器(ELS)的改编。有关已实现功能的更多信息,请参见这里)。
VSCode扩展
你可以从Marketplace或通过命令行安装VSCode扩展:
code --install-extension pylyzer.pylyzer
与Ruff的区别是什么?
Ruff与pylyzer一样,是用Rust编写的Python静态代码分析工具,但Ruff是一个linter,而pylyzer是一个类型检查器和语言服务器。 pylyzer不执行linting,而Ruff不执行类型检查。
工作原理
pylyzer内部使用Erg编程语言的类型检查器。 Erg是一种针对Python的转译语言,具有静态类型系统。
pylyzer将Python AST转换为Erg AST,并将它们传递给Erg的类型检查器。然后,它会对结果进行适当修改并显示。
限制
-
pylyzer的类型检查器仅假设(可能)静态类型的代码,因此你无法检查使用反射的代码,如
exec
、setattr
等。 -
pylyzer(= Erg的类型系统)对Python标准API有自己的类型声明。并非所有API的类型都是完整的,可能会导致出现某些API不存在的错误。
-
由于pylyzer的类型检查比较保守,你可能会遇到许多(可能是误报的)错误。我们正在努力修复这个问题,但如果你担心编辑器出现错误,请关闭诊断功能。
待办事项
- 类型检查
- 变量
- 运算符
- 函数/方法
- 类
- 类型推断
- 变量
- 运算符
- 函数/方法
- 类
- 内置模块解析(部分完成)
- 本地脚本解析
- 本地包解析
- 集合类型
-
list
-
dict
-
tuple
-
-
typing
-
Union
-
Optional
-
Literal
-
Callable
-
TypedDict
- 类型变量(
TypeVar
、Generic
) -
Protocol
-
Final
-
Annotated
-
TypeAlias
- 类型守卫(
TypeGuard
) - 其他
-
collections.abc
-
Iterable
-
Iterator
-
Mapping
-
Sequence
- 其他
-
- 类型断言(
typing.cast
) - 类型缩小(
is
、isinstance
)
1 性能测试在配备1.1 GHz Intel Core m3处理器和8 GB 1867 MHz LPDDR3内存的MacBook(2016年初)上进行。↩