ΤΕΥΧΟΣ 038  ·  11 ΝΟΕΜΒΡΙΟΥ 2026 RSS
CodeCity
ΑΝΑΠΤΥΞΗ № 0038

Ruff — γρήγορος linter και formatter για Python

Το ruff είναι ένα εργαλείο που διαβάζει τον κώδικά σου και σου δείχνει προβλήματα στυλ και λάθη, πολύ γρήγορα και με επιλογές αυτόματης διόρθωσης. Είναι τόσο γρήγορο που το αισθάνεσαι σαν έναν βοηθό που κάνει έλεγχο σε κάθε αποθήκευση.

Ruff — γρήγορος linter και formatter για Python

Δύο λέξεις πρώτα

Θέλεις έναν συνεργάτη που ελέγχει τον κώδικά σου όπως ένας διορθωτής κειμένου ελέγχει ένα άρθρο: εντοπίζει ορθογραφικά, ασυνέπειες, περιττές λέξεις και προτείνει διορθώσεις πριν στείλεις το χειρόγραφο στον εκδότη. Αυτό κάνει το ruff για τον κώδικα Python. Σε καθημερινή χρήση, τρέχει γρήγορα, επιστρέφει αποτελέσματα αμέσως και μπορεί να αλλάξει μικρά θέματα αυτόματα, χωρίς να περιμένεις. Η ιδέα δεν είναι καινούργια — υπάρχουν linters και formatters για χρόνια — αλλά το ruff σπρώχνει την ταχύτητα και τη συγκέντρωση κανόνων, ώστε ο έλεγχος να μην είναι εμπόδιο αλλά βοήθεια.

Με απλά λόγια: το ruff διαβάζει τον κώδικά σου και σου λέει τι είναι πιθανό λάθος ή ασυνέπεια. Αντί να περιμένεις το CI ή το code review, έχεις άμεσα σχόλια. Και επειδή είναι γραμμένο σε Rust και παραδίδεται σαν εκτελέσιμο, δεν χρειάζεται μεγάλος χρόνος εκκίνησης όπως με κάποιες Python-only λύσεις.

Τι κάνει

Το ruff είναι συγχρόνως linter και formatter. Εξηγώ τους όρους: linter είναι ένα εργαλείο που ελέγχει τον κώδικα για λάθη, πιθανά bugs και παραβάσεις κανόνων στυλ. Formatter είναι ένα εργαλείο που μορφοποιεί τον κώδικα με ένα προκαθορισμένο στυλ, έτσι ώστε όλοι στο έργο να έχουν ίδιο αποτέλεσμα χωρίς συζητήσεις.

Το ruff ενσωματώνει κανόνες που καλύπτουν σφάλματα χρόνου εκτέλεσης, ανενεργές εισαγωγές, μη χρησιμοποιούμενες μεταβλητές, θέματα στυλ και προτάσεις για βελτίωση. Πολλά από τα checks του αντιστοιχούν σε κανόνες που παλαιότερα καλύπτονταν από flake8, pyflakes, pycodestyle ή isort. Το ruff θέλει να αντικαταστήσει τα επιμέρους μικρά εργαλεία με ένα, προσφέροντας υψηλές ταχύτητες και ενσωματωμένο formatting.

Κύρια λειτουργία: τρέχει γρήγορα πάνω σε αρχεία ή φακέλους και τυπώνει λίστα σφαλμάτων με κωδικούς σφάλματος. Παράγει output κατάλληλο για CI, επεξεργαστές κειμένου και editor integrations. Μπορεί να κάνει αυτόματες διορθώσεις με επιλεκτικές εντολές. Επίσης εκθέτει υποεντολές για να βλέπεις όλους τους κανόνες, για να δημιουργείς ή να ελέγχεις config, και διαθέτει έναν language server για editors που θέλουν live ανατροφοδότηση.

Σημείο-κλειδί: η ταχύτητα. Ο σχεδιασμός σε Rust και το compile-time optimization σημαίνουν ότι το ruff τρέχει πολύ πιο γρήγορα από παραδοσιακούς Python linters. Αυτό το καθιστά κατάλληλο για pre-commit hooks, τοπικά checks κατά την ανάπτυξη και ως στάδιο στο CI χωρίς σημαντική επιβάρυνση χρόνου.

Επιπλέον, το ruff παρέχει ένα μεγάλο σύνολο κανόνων (βλέπε ruff rule --all) και μηχανισμούς επιλογής ή παράβλεψης. Μπορείς να ενεργοποιείς ή να απενεργοποιείς συγκεκριμένες ομάδες κανόνων, να αλλάζεις το επίπεδο σοβαρότητας και να γράφεις εξαιρέσεις ανά αρχείο ή project μέσω αρχείων ρυθμίσεων.

Τέλος, το ruff προσφέρει και δυνατότητες formatting. Η υποεντολή format μορφοποιεί κώδικα σύμφωνα με τους κανόνες του εργαλείου, με συμπεριφορά παρόμοια με άλλους μορφοποιητές όπως το black, αλλά ενσωματωμένη στο ίδιο εκτελέσιμο με το linting.

Τι δεν κάνει

Πρέπει να το ξεκαθαρίσουμε: το ruff δεν είναι πανάκεια. Πρώτον, δεν ελέγχει αυτόματα όλους τους κανόνες που μπορεί να περιμένεις από έναν συνδυασμό flake8 + plugins. Κάποιοι κανόνες είναι σε κατάσταση "preview" και δεν ενεργοποιούνται από προεπιλογή. Αυτό σημαίνει στην πράξη ότι, ακόμα αν ένα άλλο εργαλείο επιστρέφει σφάλματα συγκεκριμένης κατηγορίας, το ruff μπορεί να μην τα εμφανίσει μέχρι να τα ενεργοποιήσεις ρητά.

Δεύτερον, το ruff δεν κάνει ασφαλείς, αυτοματοποιημένες διορθώσεις για κάθε είδους αλλαγή. Υπάρχουν περιπτώσεις όπου μια διόρθωση θα άλλαζε τη συμπεριφορά του προγράμματος. Σε αυτές τις περιπτώσεις το ruff κρατάει τα χέρια του και απαιτεί ρητή έγκριση μέσω των επιλογών --fix --unsafe-fixes για να προβεί σε επισφαλείς μετατροπές.

Τρίτον, το ruff δεν αντικαθιστά το ανθρώπινο review για λογικά σφάλματα ή αρχιτεκτονικές αποφάσεις. Μπορεί να σε βοηθήσει να βρεις συντακτικά σφάλματα, ανενεργούς import, θέματα στυλ και πιθανές παγίδες, αλλά δεν θα αντικαταστήσει το design review ενός senior developer.

Τέταρτον, το ruff δεν περιλαμβάνει εκ προεπιλογής κάθε plugin που ίσως είχες στο flake8. Αν έχεις συγκεκριμένο plugin που παράγει κρίσιμες αναφορές, πρέπει να συγκρίνεις τους κανόνες και να ενεργοποιήσεις αντίστοιχα checks ή να διατηρήσεις το plugin ανεξάρτητα.

Ένα συγκεκριμένο όριο που είδαμε στη δοκιμή μας: κάποιοι κανόνες E3 (π.χ. E302 — κενές γραμμές ανάμεσα σε συναρτήσεις) ήταν σε preview και, όταν τους ενεργοποιήσαμε με --select E302, ο ruff απάντησε ότι το preview δεν είναι ενεργό, οπότε η επιλογή δεν είχε αποτέλεσμα. Συνεπώς, μην περιμένεις ότι το ruff θα ελέγξει ο,τιδήποτε τύπου flake8 χωρίς επιπλέον ρύθμιση.

Επίσης, αν χρειάζεσαι εξειδικευμένες αναφορές στατιστικής ή formatting που υπερβαίνει το scope των κοινών κανόνων, πιθανόν να χρειαστείς επιπλέον εργαλεία.

Πώς το χρησιμοποιείς

Υπάρχουν τρεις κοινές διαδρομές εγκατάστασης: μέσω pip, μέσω pipx, ή με το έτοιμο εκτελέσιμο που δίνει το ίδιο το project. Σε κάθε περίπτωση, οι εντολές τρέχουν από τον φάκελο του έργου σου.

Εγκατάσταση με pip (μέσα σε virtualenv):

pip install ruff

Εγκατάσταση με pipx (παγκόσμια, απομονωμένο):

pipx install ruff

Λήψη του εκτελέσιμου (release) και χρήση χωρίς Python: (στα συστήματα που υποστηρίζει το release, κατέβασε το bin από το GitHub releases και βάλε το στο PATH).

./ruff check path/to/file.py

Βασική χρήση για έλεγχο αρχείου ή φακέλου:

ruff check src/

Αυτόματη διόρθωση (προσοχή: ασφαλείς διορθώσεις μόνο):

ruff check --fix src/

Αυτόματες και "μη ασφαλείς" διορθώσεις (χρησιμοποιήστε με προσοχή):

ruff check --fix --unsafe-fixes src/

Μορφοποίηση αρχείων:

ruff format src/

Λίστα όλων των κανόνων:

ruff rule --all

Πληροφορίες ρύθμισης και αρχείο config:

ruff config

Έκδοση:

ruff --version

Σημειώσεις για ρυθμίσεις: το ruff μπορεί να διαβάζει κανόνες από pyproject.toml ή από άλλα αρχεία ρυθμίσεων. Δεν είναι απαραίτητο να το δηλώσεις σε κάποιο κεντρικό registry για να το τρέξεις τοπικά: απλά εγκαθιστάς και τρέχεις. Αν το ενσωματώσεις στο CI, βάλ' το ως βήμα στο pipeline.

Ειδικά για editors: υπάρχει υποστήριξη μέσω language server (η υποεντολή server) και μέσω plugins που συνδέουν το εκτελέσιμο με τον editor.

Αν δουλεύεις με βοηθό κώδικα — Claude Code, Codex CLI, Cursor — το ruff δεν αλλάζει: το καλείς σαν απλή εντολή μέσα στο workflow του. Δύο πρακτικές σημειώσεις, μία για κάθε περίπτωση.

Claude Code

Εφόσον το περιβάλλεις με ένα script, κάλεσε το εκτελέσιμο ακριβώς όπως από το κέλυφος. Ο Claude Code που τρέχει εντολές σε container ή εργαλείο build καλεί:

ruff check --fix src/

Μια προσοχή: βεβαιώσου ότι το περιβάλλον του runner έχει το εκτελέσιμο στο PATH. Αν χρησιμοποιείς image, εγκατέστησε το μέσω pip πριν το βήμα του ruff.

Codex CLI

Ο Codex CLI που τρέχει commands σε απομακρυσμένο agent χρησιμοποιεί την ίδια εντολή. Για pre-commit hooks, άφησε το ruff να τρέχει τοπικά και επέστρεψε τα αποτελέσματα στο CI runner. Παράδειγμα που περνάει αποτελέσματα:

ruff check --format=json src/ > ruff-report.json

Cursor

Ο Cursor συνδέει editor actions με εντολές. Στο workflow του editor, ρύθμισε το να καλεί:

ruff check --fix ${file_path}

και αν θέλεις ζωντανό formatting, τρέξ ruff format σαν action κατά το save.

Πώς το οδηγείς από το κέλυφος

Το ruff είναι εργαλείο γραμμής εντολών με υποεντολές. Αυτό σημαίνει: ανοίγεις ένα τερματικό, καλείς το εκτελέσιμο και του δίνεις υποεντολή όπως check, format ή rule. Δεν είναι MCP server που θέλει daemon configuration για να δουλέψει — τρέχει όταν το καλείς.

Δύο εντολές για την καθημερινή χρήση από το κέλυφος:

ruff check --fix src/

και

ruff format src/

Δεν χρειάζεται να το "δηλώσεις" σε κάποιο άλλο αρχείο για να το τρέξεις τοπικά. Αν θέλεις να τρέχει αυτόματα σε κάθε commit, πρόσθεσέ το σε pre-commit ή σαν βήμα στο CI. Αλλά η ίδια η εκτέλεση δεν απαιτεί daemon ή registry declaration: εγκαθιστάς κι εκτελείς.

Η δοκιμή μας με τα χέρια

Θα σου πω την ιστορία της δοκιμής μας βήμα-βήμα, με τα νούμερα όπως τα μέτρησα σήμερα σε καθαρό φάκελο. Αυτό είναι αποτέλεσμα που μπορούμε να επαληθεύσουμε.

Κατέβασα το εκτελέσιμο και δημιούργησα έναν φάκελο δοκιμής με ένα αρχείο που περιείχε σκόπιμα λάθη. Το αρχείο είχε εισαγωγές που δεν χρησιμοποιούνταν και μεταβλητές που ορίζονταν αλλά δεν χρησιμοποιούνταν. Έτρεξα:

ruff check test_bad.py

Το ruff επέστρεψε τέσσερα σφάλματα: δύο F401 που αντιστοιχούν σε εισαγωγές os και sys που δεν χρησιμοποιούνται και δύο F841 για μεταβλητές ορισμένες και μη χρησιμοποιούμενες. Στη συνέχεια έτρεξα:

ruff check --fix test_bad.py

Με αυτή την εντολή το ruff διόρθωσε αυτόματα τις δύο εισαγωγές (F401) και έσβησε τις γραμμές που τις περιείχαν. Τα δύο F841 παρέμειναν. Το εργαλείο τα χαρακτήρισε "μη ασφαλή" για αυτόματη διόρθωση και δεν τα άλλαξε χωρίς τη ρητή επιλογή --unsafe-fixes.

Ακόμη, μέτρησα την ταχύτητα σε ένα μεγαλύτερο αρχείο 9.000 γραμμών. Το ruff ολοκλήρωσε σε 0,168 δευτερόλεπτα. Για σύγκριση, το flake8 στο ίδιο αρχείο κράτησε 5,406 δευτερόλεπτα. Αυτό σημαίνει μια μέτρηση όπου το ruff ήταν περίπου 32 φορές ταχύτερο. Λέω "μία μέτρηση" επειδή έγινε μια σειρά μετρήσεων στο ίδιο αρχείο και αυτός ο αριθμός προέρχεται από αυτές· δεν είναι ευρύτερο συγκριτικό τεστ σε πολλαπλά μηχανήματα.

Άλλο αποτέλεσμα: όταν ζήτησα ρητά τον κανόνα E302 με --select E302 στο ίδιο αρχείο 9.000 γραμμών, το ruff απάντησε ότι η επιλογή δεν έχει αποτέλεσμα επειδή οι κανόνες E3 βρίσκονται σε κατάσταση preview και δεν είναι ενεργοποιημένοι. Συνεπώς το flake8 εντόπισε E302 ενώ το ruff απάντησε "All checks passed" μέχρι να ενεργοποιήσουμε το preview.

Κατέγραψα επίσης συνολικό αριθμό κανόνων με ruff rule --all και έλαβα 1.068 κανόνες.

Τέλος, παρατήρησα τις μεταφορές: το εκτελέσιμο είναι στατικό και περίπου 26.974.000 bytes. Στο PyPI, η τελευταία έκδοση είναι 0.17.4 που δημοσιεύτηκε στις 5/11/2026 και το πακέτο για Windows έχει μέγεθος 10.292.922 bytes ενώ το sdist 5.357.750 bytes. Στα στατιστικά του PyPI το project εμφανίζει 100.563.269 λήψεις την εβδομάδα, 304.029.216 τον μήνα και 17.371.890 σε μία μέρα. Στο GitHub το αποθετήριο astral-sh/ruff έχει 51.183 αστέρια, 2.651 forks, 2.297 ανοιχτά issues, με πρώτο commit 9/8/2022 και τελευταίο push 11/11/2026. Η άδεια είναι MIT, από το αποθετήριο (το πεδίο άδειας στο PyPI είναι κενό).

Αυτά τα νούμερα αντικατοπτρίζουν τη δυναμική και την υιοθέτηση: πολύ μεγάλες λήψεις, ενεργό development και μεγάλο κοινό ενδιαφέρον. Ταυτόχρονα, τα όρια στην προεπιλεγμένη επιλεξιμότητα κανόνων δείχνουν ότι χρειάζεται προσεκτική ρύθμιση όταν έρχεσαι από άλλα εργαλεία.

Τι κοστίζει

Εδώ μετράμε τι πληρώνει κάποιος σε tokens, χώρο και χρήμα για να χρησιμοποιήσει το ruff.

Tokens: μηδέν. Το ruff δεν είναι διακομιστής που δηλώνεις σε ένα μοντέλο — δεν φορτώνει κανένα σχήμα εργαλείων στο πλαίσιο κανενός μοντέλου. Δεν υπάρχει «φόρος πλαισίου» εδώ, και αυτό δεν είναι εκτίμηση: βγαίνει από τη ροή. Το καλείς από το κέλυφος, το αποτέλεσμα μένει στο τερματικό σου ή σε ένα αρχείο, και το μοντέλο δεν βλέπει τίποτα από αυτό αν δεν του το δώσεις εσύ. Είναι η διαφορά ανάμεσα σε ένα εργαλείο γραμμής εντολών και σε έναν MCP server που κουβαλά την περιγραφή κάθε εργαλείου του σε κάθε κλήση.

Χώρος: ένα αρχείο, όχι ένα οικοσύστημα. Το εκτελέσιμο είναι ένα στατικό αρχείο 26.974.000 bytes (περίπου 25,7 MB) — δεν χρειάζεται Python εγκατεστημένη δίπλα του για να τρέξει, γιατί είναι γραμμένο σε Rust. Αν το πάρεις από το PyPI, το πακέτο για Windows είναι 10.292.922 bytes (περίπου 9,8 MB) και ο πηγαίος κώδικας 5.357.750 bytes. Δεν έχει εξαρτήσεις να κατεβάσει.

Χρήμα: μηδέν. Άδεια MIT, ελεύθερο, χωρίς λογαριασμό, χωρίς κλειδί, χωρίς συνδρομή.

Και ο χρόνος, που είναι το πραγματικό κέρδος: στη δοκιμή μας, σε ένα αρχείο 9.000 γραμμών το ruff τελείωσε σε 0,168 δευτερόλεπτα ενώ το flake8 στο ίδιο αρχείο έκανε 5,406 δευτερόλεπτα. Δηλαδή κάθε φορά που τρέχει ο έλεγχος γλιτώνεις περίπου πέντε δευτερόλεπτα σε αυτό το μέγεθος — και σε ένα CI που τρέχει δεκάδες φορές την ημέρα, αυτό είναι το ποσό που μετράει.

Πότε αξίζει

Το ruff αξίζει όταν θέλεις γρήγορο feedback και να μειώσεις τον χρόνο που ξοδεύεται σε linting στο CI. Αν το project σου έχει μεγάλο codebase ή αν οι προεπιλεγμένες λύσεις αργούν, το ruff μπορεί να σου δώσει άμεση βελτίωση στην παραγωγικότητα. Επίσης αξίζει όταν θέλεις να συγκεντρώσεις linting και formatting σε ένα εργαλείο και να εκμεταλλευτείς το πολύ μεγάλο σύνολο κανόνων που παρέχει.

Δεν αξίζει όταν έχεις εξαρτήσεις από plugins ή έλεγχο που δεν υποστηρίζεται και δεν μπορείς να αλλάξεις το workflow. Αν το project σου απαιτεί συγκεκριμένους κανόνες flake8 που δεν είναι παρόντες ή σε preview και δεν μπορείς να τα ενεργοποιήσεις, τότε η μετάβαση θα έχει κόστος. Επίσης, αν χρειάζεσαι αναφορές που μόνο ένα συγκεκριμένο εργαλείο παράγει, μπορεί να διατηρήσεις και το προηγούμενο εργαλείο παράλληλα.

Τέλος, για μικρά προσωπικά scripts όπου ο χρόνος εκτέλεσης του linter δεν είναι πρόβλημα, το όφελος είναι μικρό· το κέρδος γίνεται ορατό σε μεγαλύτερα έργα ή όταν το linting τρέχει συχνά.

Τέλος

Το ruff είναι εργαλείο που αλλάζει το παιχνίδι στο linting της Python με την ταχύτητα και το εύρος κανόνων που παρέχει. Δεν είναι πανάκεια και έχει όρια που πρέπει να τα γνωρίζεις πριν το ενσωματώσεις πλήρως, αλλά στις περισσότερες ροές εργασίας προσφέρει πραγματικό κέρδος. Στις δοκιμές μας έδειξε ταχύτητες που το καθιστούν αξιόπιστο για καθημερινή χρήση και για CI.

Ως πρακτική συμβουλή: πριν αντικαταστήσεις πλήρως ένα υπάρχον pipeline, κάνε ένα πιλοτικό branch και τρέξε το ruff παράλληλα με τα εργαλεία που ήδη έχεις. Σύγκρινε τα reports για μερικές εβδομάδες, ξεχώρισε τους κανόνες που λείπουν ή είναι σε preview και σημείωσε πόσο χρόνο γλυτώνεις σε CI. Ένα staged migration που ξεκινά με formatting και μετέπειτα περνά σε full linting συχνά είναι ο ασφαλέστερος δρόμος.

Αν εργάζεσαι σε ομάδα, έλεγξε το πώς οι εξαιρέσεις θα δηλωθούν: καλύτερα σε pyproject.toml που ελέγχεται από το repo παρά σε τοπικά ignore. Για pre-commit, το ruff είναι αρκετά γρήγορο ώστε να τρέχει σε commit hooks χωρίς να ενοχλεί. Για μεγάλα mono-repos, συνιστάται να ορίσεις scope ανά πακέτο και να μην πασάρεις ολόκληρο το repository σε κάθε run.

Τέλος, φύλαξε πάντα ένα κανάλι επικοινωνίας για developers όταν ενεργοποιείς preview κανόνες: δεν είναι απλά νέο λάθος, είναι αλλαγή πολιτικής στυλ και ίσως χρειαστεί συζήτηση. Με μεθοδική εφαρμογή, το ruff γίνεται εργαλείο που μειώνει τα nitpicks και απελευθερώνει τον χρόνο του reviewer για ουσιαστικά θέματα.

Πηγές:

https://github.com/astral-sh/ruff

https://docs.astral.sh/ruff/

https://pypi.org/project/ruff/

https://pypistats.org/packages/ruff

Εγκατάσταση

4 ΒΗΜΑΤΑ
  1. pip install ruff
  2. ruff check src/
  3. ruff check --fix src/
  4. ruff format src/
Ruff — γρήγορος linter και formatter για Python · ΑΠΟΤΕΛΕΣΜΑ
ΠΗΓΗ
github.com/astral-sh/ruff