Another recommendation for pylsp. Ruff is good, but it doesn't provide lookups and completions. For now, think of it as just a linter/formatter to augment pylsp
Python
Welcome to the Python community on the programming.dev Lemmy instance!
π Events
Past
November 2023
- PyCon Ireland 2023, 11-12th
- PyData Tel Aviv 2023 14th
October 2023
- PyConES Canarias 2023, 6-8th
- DjangoCon US 2023, 16-20th (!django π¬)
July 2023
- PyDelhi Meetup, 2nd
- PyCon Israel, 4-5th
- DFW Pythoneers, 6th
- Django Girls Abraka, 6-7th
- SciPy 2023 10-16th, Austin
- IndyPy, 11th
- Leipzig Python User Group, 11th
- Austin Python, 12th
- EuroPython 2023, 17-23rd
- Austin Python: Evening of Coding, 18th
- PyHEP.dev 2023 - "Python in HEP" Developer's Workshop, 25th
August 2023
- PyLadies Dublin, 15th
- EuroSciPy 2023, 14-18th
September 2023
- PyData Amsterdam, 14-16th
- PyCon UK, 22nd - 25th
π Python project:
- Python
- Documentation
- News & Blog
- Python Planet blog aggregator
π Python Community:
- #python IRC for general questions
- #python-dev IRC for CPython developers
- PySlackers Slack channel
- Python Discord server
- Python Weekly newsletters
- Mailing lists
- Forum
β¨ Python Ecosystem:
π Fediverse
Communities
- #python on Mastodon
- c/django on programming.dev
- c/pythorhead on lemmy.dbzer0.com
Projects
- PythΓΆrhead: a Python library for interacting with Lemmy
- Plemmy: a Python package for accessing the Lemmy API
- pylemmy pylemmy enables simple access to Lemmy's API with Python
- mastodon.py, a Python wrapper for the Mastodon API
Feeds
I'm using pylsp (python-language-server). My reason being a process of elimination. I also use mypy for type-checking, so even without considering the danger of allowing MS to entrench itself into my tooling, it didn't make much sense to use a tool built around pyright.
The ruff-lsp seems to only do the things that ruff is good at: linting, code formatting, auto-fix of certain issues, and I wanted more.
Since I saw that pylsp uses Jedi under the hood, and offered a mypy plugin, I felt that pylsp offer a superset of the features that the Jedi LSP has. In the end I'm happy with pylsp, and never tried Jedi LSP.
However: with the mypy plugin for pylsp, the memory usage kept growing to ridiculous amounts and getting killed, so I ended up disabling it. I had a look in their bug tracker Instead, I'm using flymake that triggers mypy on save, and that seems to work well. (I have a few changes on top of com4/flymake-mypy.el, because it leaves behind plenty of temporary files.)
That offers me:
- jump to definition (using Jedi under the hood)
- rename symbol (and then Jedi goes and rename uses of that symbol)
- smart completion (eg. offers only variables in scope, or after a
.
only the instance members, etc.) - short documentation on hover
- squiggly lines for errors found by flake8 or mypy
- and a few more that I don't really notice
One thing I struggled with: where do you install the LSP? Using pipx for a user installation, or in a per-project venv? I did the latter, which works for me because I work on a small number of projects. That also means that mypy finds all the relevant third-party libraries in that venv. I wrote a bit of elisp that allow emacs to find the right mypy binary to check code.
In VSCode the best answer by far is Pylance, which uses Pyright under the hood for type analysis.
Unfortunately while Pyright is open source, Pylance isn't (part of Microsoft's strategy to maintain control over VSCode), so you can't use it in Emacs.
Still, I would give the Pyright LSP server a try. I haven't used it but I would guess it will give you type error squiggles but maybe not code completion / go-to-definition.
Ruff is really a different thing - it is a linter like Pylint, so it only gives you some hints and fixits. You can maybe install it in addition to Pyright if you can be bothered.
Btw Pyright is far superior to Mypy - even with --strict
. I would ditch Mypy asap.
Ruff.
MS LSP is also deprecated in favor of Microsoft's pylance AFAIK. I've never used Jedi much, but it's one of the older ones and not very comprehensive to my knowledge. Ruff is relatively new but they already have >800 rules and increasing. Ruff is by far the fastest too.
No thoughts on py-lsp.
Ah, just be sure to enable most (or all) rules with ruff, as the default rule sets are pretty relaxed.
That seems like a weird dichotomy between ruff and Jedi. One does linting & formatting, the other code completion, goto-definition, refactoring. With pylsp you can have both: it uses Jedi (in the default config), and has a plugin to call ruff for linting and formatting (according to the doc; I don't actually use ruff).
Sounds like things are going very wrong in lsp land. The point of a language server is to support lots of types of tools through an abstracted server. Not to have one server per tool.
Otherwise, just use fly-checker. It can even get information from multiple tools at once.
what do you mean by one server per tool?
Op was listing different Lsp servers for things like jedi, pyright, etc. All of those things should really integrate with a single server.
insert standards xkcd
I forgot pyright: it might be a good choice, but since you like strict mode, see basedpyright instead. I don't know about integrating it with emacs though.
I'd pick between Ruff and (based)pyright - maybe both if that works in emacs.