”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 `basedpyright-langserver` 实现 Python 和 Poetry 的 Emacs

使用 `basedpyright-langserver` 实现 Python 和 Poetry 的 Emacs

发布于2024-11-05
浏览:935

Emacs for Python and Poetry Using `basedpyright-langserver`

我对当前的 Python emacs 设置非常满意,但我发现设置有点棘手。我将在这里为我未来的自己和任何其他正在寻找可靠的 emacs 配置的 Pythonista 记录我的设置。

为什么基于pyright?

到目前为止,我一直在命令行上使用 mypy --strict 来满足我所有的类型检查需求,但即使对于非常小的代码库,mypy 也相当慢,即使在 --strict 模式下,它也不如尽可能严格。它也不是我的 emacs 设置所需的语言服务器。

basedpyright 是 Pyright 的一个分支,在检查和可靠性方面都有一些出色的改进。它是一个快速且非常严格的类型检查器,另外还具有一些良好的 linting 功能。

我遇到的唯一缺点是,它在 AWS 的 boto3-stubs 客户端上的表现不如 mypy 那么好,而且它使用非标准的 #pyright:ignore comments 而不是标准的 #type:ignore comments,但是我可以忍受这些问题,支持严格的类型检查体验。

配置您的 Poetry 项目以使用 basedpyright 或 Pyright

如果您有使用 Poetry 的现有项目,您将需要稍微调整一下您的虚拟环境。

转到每个项目的根目录并运行以下命令:


poetry config --local virtualenvs.in-project true


这将创建一个 poetry.toml 文件(如果尚不存在)并添加相应的设置。

然而,这不会实际移动您现有的虚拟环境。为了使此更改生效,您必须删除现有的虚拟环境,您可以通过运行

找到该环境

poetry env info --path


不要忘记将 .venv 路径添加到 .gitignore 以及您可能使用的任何其他工具(如 pycodestyle)的配置,否则您最终会得到真是一团糟。

接下来,您应该在 pyproject.toml 中添加一个配置部分,以告诉 basedpyright 在哪里查找您的虚拟环境。


[tool.pyright]
venv=".venv"
venvPath="."


您也可以在 pyrightconfig.json 文件中执行此操作,如果与我不同的是,您还没有感觉到不同 Python 开发工具的配置文件完全超载。

安装 basedpyright 作为语言服务器

basedpyright 相对于 Pyright 的一个非常好的一点是,它将 NodeJS 依赖项构建为轮子,因此您可以放心,无论您是否安装了 NodeJS,basedpyright 都应该在您的计算机上运行。

为了隔离,通常最好使用 pipx 而不是 pip 安装可执行 Python 包。让我们继续吧。


pipx install basedpyright


为了进行健全性检查,请考虑运行


basedpyright --version


安装basedpyright还可以让您访问basedpyright-langserver命令,但这并不是真正为用户交互而编写的,所以如果您运行basedpyright-langserver或basedpyright-langserver --version或其他东西,您将获得nodejs堆栈跟踪。

配置 emacs 使用 basedpyright-langserver

我假设您作为读者知道如何从 MELPA 安装软件包并且有首选的方法。以下是您需要的所有软件包:

  • 公司
  • lsp 模式
  • lsp-pyright
  • lsp-ui
  • python 模式

安装这些,然后打开 ~/.emacs~/.emacs.d/init.el 并添加以下内容:


;; lsp global settings
(add-hook 'after-init-hook 'global-company-mode)
(setq lsp-auto-guess-root t)

;; python
(require 'lsp-mode)
(setq lsp-pyright-langserver-command "basedpyright")
(add-hook 'python-mode-hook (lambda () (require 'lsp-pyright) (lsp)))


这应该就是您所需要的。

调试 lsp 模式的一般技巧

如果您觉得您已经正确设置了所有内容,但仍然无法使用 lsp 模式来查找 Poetry 中应该可用的软件包,您可以尝试的一件事是进入并删除您的 〜/.emacs.d/.lsp-session-v1。这将导致 lsp-mode 忘记项目根目录并强制它再次查找它。

快乐编码!

我希望这能让您在 Python 开发环境方面有一个良好的开端。如果您有任何疑问,好吧,我是这一切的初学者,我可能无法帮助您,但如果您有任何在 emacs 中使用 basedpyright 的额外提示或技巧,我会考虑合并请求。

版本声明 本文转载于:https://dev.to/webbureaucrat/emacs-for-python-and-poetry-using-basedpyright-langserver-ca9?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-05-15
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-05-15
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-05-15
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-05-15
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-05-15
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。isement(Isement() trim whitespace whitesp...
    编程 发布于2025-05-15
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-05-15
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月份)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将...
    编程 发布于2025-05-15
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-05-15
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-05-15
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-05-15
  • Java为何无法创建泛型数组?
    Java为何无法创建泛型数组?
    通用阵列创建错误 arrayList [2]; JAVA报告了“通用数组创建”错误。为什么不允许这样做?答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<myO...
    编程 发布于2025-05-15
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-05-15
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-05-15

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3