Emacs中的Python类型提示

8

我来自PyCharm,想要学习如何在Emacs(Spacemacs)上设置Python。

PyCharm具有称为类型提示的功能,该功能基本上允许指定类型,然后根据指定的类型获取提示。 Python 3.5+拥有PEP 484 -- 类型提示,这允许在没有注释的情况下指定类型。在PEP 484之前,使用注释来指定类型。

Emacs中是否有类似的类型提示?


@Anzel,谢谢您的回答。这确实涵盖了Python版本为3.5+的情况。但是,对于Python < 3.5是否有类似的方法呢? - m3nthal
类型提示的语法与PY2不同,如注释所示,但是MyPy支持使用--py2标志来支持Python2的语法。我不确定flychecker是否支持这一点,你可以安装并尝试一下。 - Anzel
你确定吗?我使用MyPy来验证我的类型提示...虽然这是在vim中。 - Anzel
让我们在聊天中继续这个讨论 - m3nthal
我不确定自动完成功能,因为我个人不使用它们,您可以查看扩展/插件文档,看看它们是否支持。 - Anzel
显示剩余4条评论
3个回答

3

遗憾的是,它只支持Python 3。PEP 484对Python 2的提示建议(通过注释)不支持。 - Apteryx

3

我在2020年看到了这个问题,发现有一些更好的工具可以用来解决它。仅使用Jedi可能无法满足您的需求。相反,您很可能需要使用 elpy flycheck flycheck-pycheckers pyflakes mypy 组合。

Elpy是Emacs Python IDE包。flycheck是Emacs的通用语法检查工具包。flycheck-pycheckers与flycheck配合使用,允许您使用多个Python语法检查器,因为pyflakes不处理类型提示,而mypy不处理通用语法-您需要同时使用两者。

因此,您需要执行以下步骤:

  1. 使用pip安装pyflakes和mypy。

  2. 在您的Emacs配置中安装 use-package (我会将其说明留给您)。

  3. 将以下行添加到您的init.el或.emacs文件中:

;; flycheck
(use-package flycheck
  :ensure t
  :config
  (global-flycheck-mode t)
  ;; note that these bindings are optional
  (global-set-key (kbd "C-c n") 'flycheck-next-error)
  ;; this might override a default binding for running a python process,
  ;; see comments below this answer
  (global-set-key (kbd "C-c p") 'flycheck-prev-error)
  )
;; flycheck-pycheckers
;; Allows multiple syntax checkers to run in parallel on Python code
;; Ideal use-case: pyflakes for syntax combined with mypy for typing
(use-package flycheck-pycheckers
  :after flycheck
  :ensure t
  :init
  (with-eval-after-load 'flycheck
    (add-hook 'flycheck-mode-hook #'flycheck-pycheckers-setup)
    )
  (setq flycheck-pycheckers-checkers
    '(
      mypy3
      pyflakes
      )
    )
  )
;; elpy
(use-package elpy
  :after poetry
  :ensure t
  :config
  (elpy-enable)
  (add-hook 'elpy-mode-hook 'poetry-tracking-mode) ;; optional if you're using Poetry
  (setq elpy-rpc-virtualenv-path 'current)
  (setq elpy-syntax-check-command "~/.pyenv/shims/pyflakes") ;; or replace with the path to your pyflakes binary
  ;; allows Elpy to see virtualenv
  (add-hook 'elpy-mode-hook
        ;; pyvenv-mode
        '(lambda ()
           (pyvenv-mode +1)
           )
        )
  ;; use flycheck instead of flymake
  (when (load "flycheck" t t)
  (setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
  (add-hook 'elpy-mode-hook 'flycheck-mode))
  )
;; poetry
(use-package poetry
  :ensure t)

这个方案将帮助你在Emacs中设置Python语法和类型提示。


2
(kbd "C-c p") 代表运行 Python 进程,最好为其设置不同的键绑定。 - alper
2
这是一个很好的观点@alper,我通常不在我的工作流程中使用“运行Python进程”,所以我忽略了它。我会编辑我的答案。 - jidicula

2

elpy曾经很好用,我使用了与@jidicula非常相似的设置。然而,elpy不再与当前版本的jedi兼容,这个问题已经超过一年没有解决。原来elpy不再维护,参见https://github.com/jorgenschaefer/elpy

我尝试了eglot,它能够胜任工作。然而,eglot的作者坚持使用过时的flymake而不是其现代替代品flycheckflycheck可以同时使用mypy3pyflakes,而flymake不能,因此必须在同一个缓冲区中同时使用flycheckflymake,这会产生不必要的摩擦和新的困难,我不想浪费时间。

lsp-mode目前似乎是最好的选择。它更受欢迎,有5倍的贡献者,而且更加灵活和不持有偏见,因为它可以与flycheckflymake同时使用。

我使用以下命令安装lsp-mode Python依赖项:

conda install python-lsp-server pylsp-mypy

这些内容也应该可以通过 pip 获得。


你能再解释一下吗?我很感激你提醒我 elpy 已经不再积极维护了。我已经确认这是真的。但是,你需要更详细地解释一下 lsp-mode 是什么,它对你有什么作用等等。例如,你需要卸载 elpy 包才能做到这一点吗?有什么配置建议吗? - pauljohn32
@pauljohn32 我推荐查看lsp-mode的文档。 - Maxim Egorushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接