Pylance vs. Ruff — die drängenden Fragen beantwortet
Diese Fragen kamen auf nach der Arbeit mit VS Code Console-Logs — deshalb landen sie im Blog, nicht nur im Chat:
Gehört python.languageServer in die User Settings oder in die Workspace Settings?
Was ist moderner: Pylance oder Ruff? Brauche ich Pylance noch, wenn Ruff da ist?
Wie installiert man Ruff — workspace-weit oder user-weit?
Kurze Antwort: Pylance und Ruff sind keine Konkurrenten. Sie erledigen vollständig verschiedene Aufgaben und ergänzen sich ideal. Wer beide richtig kombiniert, hat das stärkste Python-Setup in VS Code.
Black-kompatibel bedeutet: Ruff formatiert Python-Code nach exakt denselben Regeln wie das verbreitete Tool Black — konsequente Anführungszeichen, feste Zeilenlänge (88 Zeichen), kein Stil-Diskussionen. Ein Drop-in-Replacement: Wer bisher Black verwendet hat, kann ohne Anpassungen im Code vollständig zu Ruff wechseln.
TL;DR
Pylance ≠ Ruff. Beide zusammen = das stärkste Setup.
User Settings (%APPDATA%\Code\User\settings.json):
Was macht was? Zwei Werkzeuge — eine klare Trennung
Das häufigste Missverständnis: Ruff ersetzt Pylance nicht. Die beiden Tools lösen grundlegend verschiedene Probleme.
Funktion
Pylance
Ruff
IntelliSense / Autocomplete
✅
❌
Typ-Prüfung (via Pyright)
✅
❌
Go-to-Definition
✅
❌
Hover-Docs / Signaturen
✅
❌
Linting (flake8, pylint, …)
schwach
✅
Formatting (Black-kompatibel)
❌
✅
Import-Sortierung (isort)
❌
✅
Geschwindigkeit
normal
10–100× schneller
Pylance ist der Language Server — der Motor hinter Intellisense, Autovervollständigung, Typ-Prüfung und Refactoring. Ohne Pylance (oder einen gleichwertigen Pyright-basierten Server) sind Python-Dateien für VS Code im Grunde „blindes Text".
Ruff ist das Linting- und Formatting-Tool — geschrieben in Rust, extrem schnell, und als Replacement für flake8, pylint, isort, pyupgrade und Black konzipiert. Alles in einem einzigen Binary.
In meinem Setup nutze ich diese Entlastung bewusst global in den User Settings. Für Teams oder Repositories mit stark abweichenden Standards kann Workspace-Scoping trotzdem der bessere Kompromiss sein.
Spalten
python.languageServer
User (global)
Globale Präferenz — gilt für alle Projekte gleich
python.analysis.typeCheckingMode
Workspace
Strenge variiert je Projekt (strict / basic / off)
python.analysis.extraPaths
Workspace
Projektspezifische Import-Pfade
python.defaultInterpreterPath
Workspace
Jedes Projekt nutzt sein eigenes venv
python.analysis.diagnosticMode
Workspace
Belastete Projekte brauchen "openFilesOnly"
[python] › editor.defaultFormatter
User (global)
Ruff als Standard-Formatter für alle Python-Dateien
In den Settings-Dateien konkret
User Settings (%APPDATA%\Code\User\settings.json):
Empfehlung: beides — globale CLI + lokales Binary im venv.
Global (für alle Projekte, ohne venv-Konflikt):
# Mit pipx — empfohlen, weil isoliert:
pipx install ruff
# Oder klassisch global:
pip install ruff
Projektlokal (im venv des Projekts):
# Im aktivierten venv:
pip install ruff
Oder als Dev-Abhängigkeit in pyproject.toml:
[project.optional-dependencies]
dev = ["ruff>=0.4.0"]
VS Code Extension (charliermarsh.ruff)
Voraussetzung: Die VS-Code-Extension charliermarsh.ruff muss installiert sein. Die reine Zuweisung editor.defaultFormatter = charliermarsh.ruff reicht nicht, wenn die Extension fehlt.
Empfohlener Eintrag in die VS-Code-User-Settings (%APPDATA%\Code\User\settings.json):
In meinem Setup ist zusätzlich der native Ruff-Server aktiviert:
Fazit: Pylance dauerhaft an — richtig konfiguriert
Kurz: Pylance nicht deaktivieren, sondern richtig konfigurieren. Wer Pylance „bei Bedarf" ein- und ausschaltet, schafft sich unnötige Arbeit ohne echten Vorteil.
Pylance ist der Motor hinter Intellisense, Hover-Docs, Go-to-Definition und Refactoring — Features, die VS Code zur echten Entwicklungsumgebung machen. Bei korrekter Konfiguration verursacht er kaum Mehraufwand.
Das ist in meinem aktuellen Setup bewusst userweit gesetzt. Wer in Teams mit unterschiedlichen Vorgaben arbeitet, kann den Scope enger ziehen und projektbezogene Regeln stärker in .vscode/settings.json halten.
diagnosticMode: openFilesOnly ist der entscheidende Schalter für Python-Projekte mit vielen Dateien oder externen Abhängigkeiten: Pylance analysiert nur aktuell geöffnete Tabs statt das gesamte Projekt im Hintergrund zu durchsuchen. Das hält den Editor schnell — auch bei größeren Projekten mit Vagrant-Scripts, PHP-Begleitdateien oder geteilten Abhängigkeiten.
Wann Pylance per Workspace deaktivieren?
Nur wenn ein Workspace kein dediziertes venv braucht — z. B. reine Hilfsskripte ohne Typ-Abhängigkeiten. In diesem Fall genügt ein workspace-lokales Override:
{ "python.languageServer": "None" }
Das deaktiviert Pylance nur für diesen Workspace, ohne die globale User-Setting zu verändern.
Die Aufgabenteilung bleibt klar
Aufgabe
Tool
Wo konfigurieren
IntelliSense, Typ-Prüfung, Refactoring
Pylance
User Settings (immer an)
Linting, Formatting, Import-Sort
Ruff
User Settings (immer an)
Strenge der Typ-Prüfung
typeCheckingMode
Workspace Settings
Welches venv
defaultInterpreterPath
Workspace Settings
flake8, pylint, mypy, isort, Black — werden nicht mehr benötigt. Ruff ersetzt alle.
If my IT guides or the Snapmaker Wiki saved your project (or your hardware), I'd appreciate a coffee! ☕ Your support doesn't just cover hosting and testing costs—it also fuels the development of my apps and tools. Every donation helps me dedicate more time to coding solutions that make our tech-life easier. Thank you for being part of this!