目前大家都在用哪一款 Python 的开源 LSP?

最近有两个新兴的 LSP(都是用 Rust 写的):

  • uv 和 ruff 作者开发的 ty
  • 脸书开发的 pyrefly

以及本人已知的还在维护的项目:

  • 微软的 pyright(pylance 的基础,但是 pylance 是闭源的)
  • basedpyright
  • pylsp
1 个赞

上lsp-bridge用ty+pyrefly+ruff三件套

1 个赞

二者可以一起启用么?

可以混着用,我主要是用这几个的diagnostics和code_action,每个提供的功能都有些不一样

1 个赞

之前一直在用 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) 竟然无法推导出 bBClass 的实例,因此无法补全 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

1 个赞

不过坏消息是,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 带来了什么样子的新语法 ,所以感觉应该影响不大 :joy::joy:

你用uv管理python环境,所以每个项目都要设置一下lsp server也是正常。ty支持补全和跳转,速度也可以,只是功能还不全,bug还比较多。

奇怪的是我的环境上现在pyright,basedpyright都用不了,显示一致reconnect。最后退回pylsp,除了内存占用大点倒也没毛病。

1 个赞

用 uv tool install 装一个全局的 python-lsp-server,就不需要每个项目都装一个了。