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

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

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

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]删除
最新教程 更多>
  • React:了解 React 的事件系统
    React:了解 React 的事件系统
    Overview of React's Event System What is a Synthetic Event? Synthetic events are an event-handling mechanism designed by React to ach...
    编程 发布于2024-11-05
  • 为什么在使用 Multipart/Form-Data POST 请求时会收到 301 Moved Permanently 错误?
    为什么在使用 Multipart/Form-Data POST 请求时会收到 301 Moved Permanently 错误?
    Multipart/Form-Data POSTs尝试使用 multipart/form-data POST 数据时,可能会出现类似所提供的错误消息遭遇。理解问题需要检查问题的构成。遇到的错误是 301 Moved Permanently 响应,表明资源已被永久重定向。当未为 multipart/f...
    编程 发布于2024-11-05
  • 如何使用日期和时间对象确定 PHP 中的时间边界?
    如何使用日期和时间对象确定 PHP 中的时间边界?
    确定 PHP 中的时间边界在此编程场景中,我们的任务是确定给定时间是否在预定义的范围内。具体来说,我们得到三个时间字符串:当前时间、日出和日落。我们的目标是确定当前时间是否位于日出和日落的边界时间之间。为了应对这一挑战,我们将使用 DateTime 类。这个类使我们能够表示和操作日期和时间。我们将创...
    编程 发布于2024-11-05
  • 如何使用 CSS 变换比例修复 jQuery 拖动/调整大小问题?
    如何使用 CSS 变换比例修复 jQuery 拖动/调整大小问题?
    jQuery 使用 CSS 变换缩放拖动/调整大小问题: 当应用 CSS 变换时,特别是变换:矩阵(0.5, 0, 0, 0.5, 0, 0);,对于一个 div 并在子元素上使用 jQuery 的draggable() 和 resizing() 插件,jQuery 所做的更改变得与鼠标位置“不同步...
    编程 发布于2024-11-05
  • 如何修复 TensorFlow 中的“ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型浮点)”错误?
    如何修复 TensorFlow 中的“ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型浮点)”错误?
    TensorFlow:解决“ValueError: Failed to Convert NumPy Array to Tensor (Unsupported Object Type Float)”工作时遇到的常见错误TensorFlow 的错误是“ValueError:无法将 NumPy 数组转换为...
    编程 发布于2024-11-05
  • 如何高效判断本地存储项是否存在?
    如何高效判断本地存储项是否存在?
    确定本地存储项目是否存在使用 Web 存储时,在访问或修改特定项目之前验证它们是否存在至关重要。在本例中,我们想要确定 localStorage 中是否设置了特定项目。当前方法检查项目是否存在的当前方法似乎是:if (!(localStorage.getItem("infiniteScro...
    编程 发布于2024-11-05
  • Java 中的原子是什么?了解 Java 中的原子性和线程安全
    Java 中的原子是什么?了解 Java 中的原子性和线程安全
    1. Java 原子简介 1.1 Java 中什么是原子? 在Java中,java.util.concurrent.atomic包提供了一组支持对单个变量进行无锁线程安全编程的类。这些类统称为原子变量。最常用的原子类包括 AtomicInteger 、 Atomic...
    编程 发布于2024-11-05
  • 前端/后端主要配置文件
    前端/后端主要配置文件
    从 DevOps 的角度来看,了解 Java 和 Node.js(后端和前端)代码库中的配置文件对于管理构建流程、部署和环境设置至关重要。以下是在 Java 和 Node.js 应用程序中需要注意的配置文件的完整列表: Java 应用程序 后端 pom.xml (Maven): 管理...
    编程 发布于2024-11-05
  • Python 中出现“意外缩进”错误的原因以及如何解决?
    Python 中出现“意外缩进”错误的原因以及如何解决?
    Python 中意外缩进的意义是什么?在 Python 编程领域,精心制作的缩进起着至关重要的作用定义代码的结构和流程。当这个缩进不经意间被打乱时,就会出现“unexpected indent”错误,提示需要立即纠正。错误信息背后:Unexpected Indent本质Python 的语法要求代码块...
    编程 发布于2024-11-05
  • 在 Node.js 中什么时候应该使用 `setImmediate` 和 `process.nextTick`?
    在 Node.js 中什么时候应该使用 `setImmediate` 和 `process.nextTick`?
    了解 setImmediate 和 nextTick 之间的差异Node.js 版本 0.10 引入了 setImmediate,这是一个旨在补充 process.nextTick 的新 API。这两个函数都提供了异步执行回调的方法,但它们具有控制其使用的独特特征。nextTick:快速和同步pro...
    编程 发布于2024-11-05
  • jQuery中如何高效获取隐藏元素的高度?
    jQuery中如何高效获取隐藏元素的高度?
    在 jQuery 中获取隐藏元素的高度处理隐藏元素时,检索其高度可能具有挑战性。暂时显示元素以测量其高度然后再次隐藏它的传统方法似乎效率低下。有没有更优化的解决方案?jQuery 1.4.2 方法这是一个使用 jQuery 1.4.2 的示例:$select.show(); optionHeight...
    编程 发布于2024-11-05
  • 为什么我不能在 Go Struct 标签中使用变量?
    为什么我不能在 Go Struct 标签中使用变量?
    在 Go 结构体标签中使用变量在 Go 中,结构体标签用于指定有关结构体中字段的元数据。虽然可以使用字符串文字定义标签,但尝试在其位置使用变量会导致错误。无效用法:const ( TYPE = "type" ) type Shape struct { Type s...
    编程 发布于2024-11-05
  • Qopy:作为开发人员我最喜欢的剪贴板管理器
    Qopy:作为开发人员我最喜欢的剪贴板管理器
    作为一名开发人员,我一直在寻找可以使我的工作流程更顺畅、更高效的工具。最近,我偶然发现了 Qopy,一个可以在 Linux 和 Windows 上运行的开源剪贴板管理器。 什么是Qopy? Qopy 是一个简单的剪贴板管理器,旨在改进标准剪贴板体验。它的设计宗旨是用户友好、可靠且快速...
    编程 发布于2024-11-05
  • 为什么我的按钮上的悬停效果不起作用?
    为什么我的按钮上的悬停效果不起作用?
    更改悬停时的按钮颜色:替代解决方案尝试更改悬停时按钮的颜色时,如果出现以下情况,可能会令人沮丧该解决方案未能产生预期的效果。考虑提供的示例代码:a.button { ... } a.button a:hover{ background: #383; }此解决方案尝试在链接悬停在“按钮...
    编程 发布于2024-11-05
  • 仅使用 Python 构建前端
    仅使用 Python 构建前端
    对于专注于后端的开发人员来说,前端开发可能是一项艰巨的、甚至是噩梦般的任务。在我职业生涯的早期,前端和后端之间的界限是模糊的,每个人都被期望能够处理这两者。 CSS,尤其是,是一场持续不断的斗争;这感觉像是一个不可能完成的任务。 虽然我喜欢前端工作,但 CSS 对我来说仍然是一个复杂的挑战,特别是因...
    编程 发布于2024-11-05

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

Copyright© 2022 湘ICP备2022001581号-3