CLI-Tool
astral-sh/ruff avatar
astral-sh/ruff

Ruff 0.16.5: Linter und Formatierer in einer Rust-Binärdatei

Ruff ist ein in Rust geschriebener Python-Linter und Code-Formatter mit über 900 Regeln, Kompatibilität zu Flake8, isort und Black sowie automatischer Fehlerkorrektur.

49.637 Sterne2.418 ForksRustMIT

Auf einen Blick

Was ist das?
Das Werkzeug ersetzt Flake8, Black, isort und weitere Tools hinter zwei Befehlen. Einordnung von Installation, Konfiguration, Regelsatz und den selbst berichteten Leistungszahlen.
Für wen ist es gedacht?
Geeignet ist Ruff für Projekte, die Linting und Formatierung aus einer Hand wollen und bereit sind, die Konfiguration auf tool.ruff umzustellen, statt drei Werkzeuge nebeneinander zu pflegen. Weniger geeignet ist es für Teams, deren Prüfkette von einzelnen Flake8-Plugins abhängt, deren Verhalten nicht nachgebildet wurde, denn das README nennt zwar rund 50 neu implementierte Plugins, eine vollständige Abdeckung wird damit aber nicht behauptet.
Darf ich es kommerziell nutzen?
Ja. MIT ist eine freizügige Lizenz: Sie dürfen darauf aufbauende Software nutzen, verändern und verkaufen, solange Sie die Urheberrechts- und Lizenzhinweise beibehalten.
Wird es noch gepflegt?
Ja. Das Repository hat innerhalb des letzten Tages neue Commits erhalten.
In welcher Sprache ist es geschrieben?
Hauptsächlich Rust, laut der Sprachstatistik von GitHub.

Die Antworten beruhen auf den GitHub-Daten des Projekts (zuletzt abgeglichen am 15. September 2026) und auf unserer Analyse. Sie sind keine Rechtsberatung.

TIEFGEHENDE OPEN-SOURCE-ANALYSE

Ruff 0.16.5: Linter und Formatierer in einer Rust-Binärdatei

Die Beschreibung des Repositories ist knapp gehalten: ein extrem schneller Python-Linter und Code-Formatierer, geschrieben in Rust. astral-sh/ruff steht unter MIT, verweist als Dokumentation auf https://docs.astral.sh/ruff und ist mit 49.366 Sternen, 2.365 Forks und 2.154 offenen Issues eines der größeren Werkzeugprojekte im Python-Umfeld. Die letzte Änderung datiert vom 27. August 2026.

Die Releases-Liste führt 0.16.5 vom 27. August 2026, 0.16.4 vom 20. August 2026 und 0.16.3 vom 13. August 2026, also einen wöchentlichen Takt. Wer Ruff in einer Prüfkette einsetzt, bekommt damit jede Woche eine neue Version und sollte die Versionsnummer festschreiben.

Der Ansatz ist eine einzelne Binärdatei mit zwei Unterbefehlen, `ruff check` für die Prüfung und `ruff format` für die Formatierung. Laut README soll Ruff Flake8 samt Dutzender Plugins, Black, isort, pydocstyle, pyupgrade und autoflake ersetzen. Getragen wird das Projekt von Astral, das auch uv und ty entwickelt.

uvx ruff@0.16.5 check: fünf Wege zur Installation

Ohne Installation lässt Ruff sich direkt aufrufen: `uvx ruff@0.16.5 check` prüft alle Dateien im aktuellen Verzeichnis, `uvx ruff@0.16.5 format` formatiert sie. Die Versionsangabe im Befehl ist freiwillig, bei einem wöchentlichen Release-Takt aber ratsam.

Dauerhaft installiert wird über mehrere Wege. Das README nennt `uv tool install ruff@latest` für eine globale Installation und `uv add --dev ruff` für ein einzelnes Projekt, daneben `pip install ruff` und `pipx install ruff`. Seit Version 0.5.0 gibt es eigene Installationsskripte: `curl -LsSf https://astral.sh/ruff/install.sh | sh` unter macOS und Linux, unter Windows `powershell -c "irm https://astral.sh/ruff/install.ps1 | iex"`. Beide Skripte gibt es auch mit fester Version im Pfad, etwa .../ruff/0.16.5/install.sh.

Für Umgebungen mit eigenen Paketquellen nennt das README Homebrew und Conda und verweist für die vollständige Liste auf die Installationsdokumentation. In einer CI-Pipeline ist der Weg über uvx am aufgeräumtesten, weil kein globaler Zustand entsteht.

ruff check und ruff format: Eingaben und die drei Integrationen

Beide Unterbefehle akzeptieren laut README ein Verzeichnis, eine einzelne Datei, ein Glob-Muster oder eine Datei mit dem Namen @arguments.txt, deren Inhalt als zeilengetrennte Argumente behandelt wird. Gerade die letzte Form ist praktisch, wenn die Liste der zu prüfenden Pfade aus einem anderen Werkzeug kommt.

Das README beschreibt drei Integrationspunkte. Für pre-commit gibt es ein eigenes Repository namens ruff-pre-commit, für VS Code eine Erweiterung und für GitHub Actions das Repository ruff-action. Zu allen drei nennt das README knappe YAML-Beispiele beziehungsweise Verweise. Als erstklassig bezeichnete Editor-Integrationen werden für VS Code und weitere Editoren beworben, die Liste der Editoren selbst steht in der Dokumentation.

Dazu kommt ein Zwischenspeicher, der unveränderte Dateien nicht erneut analysiert. Bei großen Beständen entscheidet dieser Zwischenspeicher darüber, ob die Prüfung im Sekundenbereich bleibt oder bei jeder Änderung neu durchläuft.

pyproject.toml, tool.ruff und die Voreinstellung line-length 88

Die Konfiguration liest Ruff aus drei Dateien: pyproject.toml, ruff.toml oder .ruff.toml. In einer pyproject.toml bekommen die Abschnitte das Präfix tool.ruff, was Umsteiger aus Flake8-Umgebungen zuerst irritiert, weil deren Einstellungen in eigenen Abschnitten liegen.

Die Voreinstellungen sind nah an Black gehalten. Ausgeschlossen werden laut README unter anderem .git, .venv, node_modules und site-packages, die Zeilenlänge liegt bei 88, die Einrückung bei 4 Leerzeichen und als Zielversion wird Python 3.10 angenommen. Der Formatierungsstil folgt Black bei Anführungszeichen, Einrückung, magischen abschließenden Kommas und Zeilenenden.

Für größere Bestände ist die kaskadierende Konfiguration der wichtigere Punkt: Ruff sucht Konfigurationsdateien hierarchisch, sodass ein Unterprojekt eigene Regeln setzen kann. Das README bezeichnet das Werkzeug ausdrücklich als monorepo-freundlich. Wer instabile Regeln und Schnittstellenänderungen vorab sehen will, schaltet den Vorschaumodus mit `preview = true` in der Konfiguration oder mit `--preview` auf der Kommandozeile frei.

Über 900 Regeln: F, E, B, UP, RUF und die nachgebauten Flake8-Plugins

Der Regelumfang ist die eigentliche Leistung des Projekts. Das README spricht von über 900 mitgelieferten Regeln, die nicht als Wrapper aufgerufen, sondern in Rust neu implementiert wurden. Als Standardmenge nennt das README Gruppen wie F, E, B, UP und RUF, während Stilregeln, die sich mit dem Formatierer überschneiden, außen vor bleiben.

In der Liste der neu implementierten Werkzeuge stehen rund 50 Namen, darunter flake8-bugbear, flake8-bandit, flake8-pyi, flake8-pytest-style, pydocstyle, pyupgrade, isort und yesqa. Für ein Projekt, das heute eine lange Plugin-Liste pflegt, ist genau diese Aufzählung der Prüfpunkt vor dem Umstieg.

Die vollständige Regelübersicht liegt in der verlinkten Regeldokumentation, nicht im README. Wer eine Regel gezielt abschalten will, muss dort nachsehen, wie ihr Kürzel heißt, denn die Kürzel folgen dem Vorbild der jeweiligen Herkunftswerkzeuge und sind nicht selbsterklärend.

10- bis 100-mal schneller: was die Zahlen im README tragen

Der Leistungsanspruch steht gleich im ersten Aufzählungspunkt: 10- bis 100-mal schneller als bestehende Linter wie Flake8 und Formatierer wie Black. Belegt wird er im README durch eine Grafik mit der Bildunterschrift, das CPython-Bestand werde vollständig geprüft, sowie durch fünf Zitate von Werkzeugautoren. Nick Schrock berichtet, der Durchlauf über die gesamte Dagster-Codebasis von 250.000 Zeilen dauere 0,4 Sekunden, während pylint parallel auf vier Kernen etwa 2,5 Minuten brauche. Bryan Van de Ven nennt 150- bis 200-mal schnellere Läufe als mit flake8, mit 0,2 statt 20 Sekunden über das ganze Repository.

Alle diese Angaben sind selbst berichtet. Eine Methodik, Rohdaten oder eine Beschreibung der Messumgebung enthält das Material nicht, und die Zitate stammen von Personen, die teils selbst an Ruff beteiligt sind oder dessen Verbreitung fördern. Wer eine Entscheidung darauf stützt, sollte den Durchlauf im eigenen Bestand messen.

Wer eine laufende Kette aus Flake8, Black und isort hat, gewinnt durch den Umstieg vor allem eines: eine Konfigurationsdatei statt dreier, einen Zwischenspeicher und einen kürzeren Durchlauf. Verloren gehen kann die Feinabstimmung einzelner Plugins, die Ruff nicht nachbildet. Bei 2.154 offenen Issues ist zudem davon auszugehen, dass nicht jede Regelkombination in jeder Version fehlerfrei arbeitet.

Redaktionelles Fazit

Geeignet ist Ruff für Projekte, die Linting und Formatierung aus einer Hand wollen und bereit sind, die Konfiguration auf tool.ruff umzustellen, statt drei Werkzeuge nebeneinander zu pflegen. Weniger geeignet ist es für Teams, deren Prüfkette von einzelnen Flake8-Plugins abhängt, deren Verhalten nicht nachgebildet wurde, denn das README nennt zwar rund 50 neu implementierte Plugins, eine vollständige Abdeckung wird damit aber nicht behauptet. Vor der Umstellung sollte `ruff check --diff` oder der Vorschaumodus mit `preview = true` auf einer Kopie des Codes laufen, um zu sehen, wie viele Meldungen eine bestehende Flake8-Konfiguration verlieren oder dazugewinnen würde.

Offizielle Quellen

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Community-Notizen

Community-Notizen