最近有两个新兴的 LSP(都是用 Rust 写的):
- uv 和 ruff 作者开发的 ty
- 脸书开发的 pyrefly
以及本人已知的还在维护的项目:
- 微软的 pyright(pylance 的基础,但是 pylance 是闭源的)
- basedpyright
- pylsp
最近有两个新兴的 LSP(都是用 Rust 写的):
以及本人已知的还在维护的项目:
上lsp-bridge用ty+pyrefly+ruff三件套
二者可以一起启用么?
可以混着用,我主要是用这几个的diagnostics和code_action,每个提供的功能都有些不一样
之前一直在用 pylsp(就楼主链接的那个)
后面转 ty 了。看见有人把 ty 和 ruff 混合起来用,但没有尝试过。自我感觉似乎 ty 自己也提供了错误检查功能?不是很理解此时 ruff 有什么用武之地
贴个目前的 pylsp 配置,已经把默认启用的插件都给禁用了,因为那会我单独使用 ruff 来作错误检查以及格式化(pylsp 以插件形式提供了对 ruff 调用的支持)
(setq-default eglot-workspace-configuration
'(:pylsp
(:plugins
(:autopep8
(:enabled :json-false)
:mccabe (:enabled :json-false)
:pycodestyle (:enabled :json-false)
:pydocstyle (:enabled :json-false)
:yapf (:enabled :json-false)
:pyflakes (:enabled :json-false)
:flake8 (:enabled :json-false)
:pylint (:enabled :json-false)
:ruff
(:enabled t :unsafeFixes t)))
))
ruff 可以格式化文件,ty 不行。ty 主要是做基于类型的语法分析的检查,ruff 主要是做静态的代码风格以及 style 的检查。
ty pyrefly 感觉留一个就行了,两个都具备基于类型的语法分析的检查能力。当然混着用不是不行,但是感觉没什么必要。而且两个都能提供代码补全,不会冲突吗?
pyrefly 和 ty 我都使用过。在我的工作项目中,pyrefly 的代码补全体验明显优于 ty。ty 在处理 pandas、snowflake 等常用数据相关库时表现不行,主要问题在于它往往无法推断当前变量的类型实例,从而无法提供相应类方法的补全。
例如,下面的示例中,ty(0.0.9) 竟然无法推导出 b 是 BClass 的实例,因此无法补全 print_hello。此外 ty 还有问题如推不出 pd.read_excel 的返回类型,导致后续的变量都补全不了方法名。
class AClass():
class BClass():
def __init__(self):
pass
def print_hello(self):
print("hello")
b = BClass()
def __init__(self):
pass
a = AClass()
a.b.print_hello() # 无法推断 b 的类型,因此无法提供 print_hello 的补全
必须得说,ty 的当前完成度在我的项目里还达不到可用水平。当下日常使用还是更推荐久经考验的 basedpyright。如果更在意极致的速度,可以选择 pyrefly。ty 所声称的相较 pyrefly 的类型分析的速度提升,完全属于人类感知之外的差距,而其补全体验却逊色不少。
jedi 作者的 zuban
不过坏消息是,pyrefly 目前最新只支持到 Python 3.12。
Note: The Python runtime currently only supports features up to Python version 3.12, features from newer versions are not available.
我用 Playground 试了一下,最新版的 Ty 已经可以补全 a.b.print_hello()。
如果把
b = BClass()
改写为
b: BClass = BClass()
则高亮也能够正常。
除了pyright,发现还是python-lsp-server 效果好,显示文档还带着色。
用的 python-lsp-server,但是我每个项目都需要 uv add ‘python-lsp-server[all]’ 一下,不知道是不是正常的流程。python 不大熟悉,只是写脚本的时候玩一下。
ty 看介绍是一个 type checker ? 支持补全跟跳转吗?
啊这,看来 ty pyrefly 两个项目目前的小问题还是不少啊。不过它所谓的不支持到底是什么样的不支持呢?是遇到使用了 3.13 新增的语法的代码就直接罢工,还是就只是会报一些错误的报错?另一方面我看了下 3.13 的新闻好像重点是 JIT 和线程锁移除掉了,根本不知道 3.13 带来了什么样子的新语法 ,所以感觉应该影响不大 ![]()
![]()
你用uv管理python环境,所以每个项目都要设置一下lsp server也是正常。ty支持补全和跳转,速度也可以,只是功能还不全,bug还比较多。
奇怪的是我的环境上现在pyright,basedpyright都用不了,显示一致reconnect。最后退回pylsp,除了内存占用大点倒也没毛病。
用 uv tool install 装一个全局的 python-lsp-server,就不需要每个项目都装一个了。