我来自 PyCharm,想了解 Emacs (Spacemacs) 的 Python 设置。
PyCharm 有一个名为 Type Hinting 的功能,它基本上允许指定类型,然后根据指定的类型获取提示。 Python 3.5+ 有 PEP 484 -- Type Hints,它允许在没有注释的情况下指定类型。在 PEP 484 之前,指定类型是使用注释完成的。
Emacs 有这样的类型提示吗?
我在 2020 年遇到了这个问题,发现有一些更好的工具可以解决这个问题。仅凭绝地武士可能无法让你得到你想要的东西。相反,您可能需要使用
elpy
、flycheck
、flycheck-pycheckers
、pyflakes
和 mypy
的组合。
Elpy 是 Emacs Python IDE 包。 Flycheck 是 Emacs 的通用语法检查包。 Flycheck-pycheckers 与 Flycheck 配合使用,允许您使用多个 Python 语法检查器,因为 pyflakes 不处理类型提示,而 mypy 不处理一般语法 – 您需要同时使用两者。
所以你的步骤是
使用 pip 安装 pyflakes 和 mypy。
在您的 Emacs 配置中安装
use-package
(我会将相关说明留给您)。
将以下行添加到 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 语法和类型提示。
elpy
过去很棒,我使用的设置与@jidicula非常相似。但是,elpy
不再适用于当前版本的 jedi
,并且这个问题已经一年多没有得到解决。事实证明 elpy
不再维护,请参阅 https://github.com/jorgenschaefer/elpy
我尝试了
eglot
,它成功了。然而,eglot
作者坚持使用过时的flymake
而不是现代的替代品flycheck
。 flycheck
可以同时使用mypy3
和pyflakes
,而flymake
不能,所以必须在同一个缓冲区中同时使用flycheck
和flymake
,这会产生不必要的摩擦和新的困难,我宁愿不要浪费我的时间。
lsp-mode
似乎是目前最好的选择。它更受欢迎,贡献者数量增加了 5 倍,并且更加灵活且不那么固执己见,因为它可以与 flycheck
和 flymake
一起使用。
我安装
lsp-mode
Python 依赖项:
conda install python-lsp-server pylsp-mypy
这些也应该可以通过
pip
获得。