Mit Python lassen sich rasch komplexe Aufgaben lösen. Einen Tipp- oder Syntaxfehler sieht der Entwickler allerdings erst, wenn ihm seine Eigenkreation zur Laufzeit um die Ohren fliegt. Abhilfe möchte Frosted schaffen, das Python-Skripte vor ihrer Ausführung auf Syntax- und andere häufige Mängel prüft.
Der Python-Entwickler Timothy Crosley war mit dem Tool Pyflakes [1] äußerst unzufrieden. Der Quellcode des bekannten Syntaxcheckers war ihm zu komplex, zu langsam und zu schlecht dokumentiert. Darüber hinaus antwortete der Autor von Pyflakes nicht auf seine Anfragen und Verbesserungsvorschläge. Kurzentschlossen nahm Crosley den Code von Pyflakes, verbesserte ihn, behob auch noch einige Fehler und veröffentlichte das Ergebnis Anfang 2014 unter dem Namen Frosted [2], der auf Cornflakes mit Zuckerüberzug anspielt.
Sein Fork verspricht bessere Prüfergebnisse und außerdem noch schlanken und einfach zu wartenden Code. Frosted deckt nicht nur Tipp- und Syntaxfehler auf, sondern macht auch auf andere Probleme aufmerksam. Zum Beispiel bemeckert es eingebundene, aber nicht weiter im Code benutzte Bibliotheken (Abbildung 1). Der Anwender darf außerdem vorgeben, welche Dateien und Fehler das Werkzeug ignorieren soll. Analysieren kann Frosted derzeit Skripte für die Python-Versionen 2.4 bis 3.4.
Pip, Pip, hurra!
Das Programm lässt sich bequem und schnell per Pip installieren:
pip install frosted --upgrade
Frosted überprüft alle Python-Skripte, die man ihm bei seinem Aufruf als Parameter übergibt. Im folgenden Beispiel würde das Tool die Dateien »beispiel1.py« und »beispiel2.py« auf Fehler abklopfen:
frosted beispiel1.py beispiel2.py
Damit sich Python-Anwender bei größeren Softwareprojekten nicht die Finger wund tippen müssen, gibt es den Parameter »-r« . Frosted checkt damit nicht nur sämtliche Dateien in dem dahinter angegebenen Verzeichnis, sondern durchläuft auch rekursiv dessen Unterverzeichnisse:
frosted -r beispiel/
Das Tool verdaut selbstverständlich auch Wildcards: »frosted beispiel/*.py« würde alle Python-Skripte mit der Endung ».py« im Verzeichnis »beispiel« untersuchen. Beim Aufruf von »frosted -« nimmt das Tool die Dateinamen über die Standardeingabe entgegen. Dabei ist das Minuszeichen übrigens Pflicht – der Vorgänger Pyflakes lauschte hingegen auch dann an der Standardeingabe, wenn man ihn gänzlich ohne Parameter aufrief. Abschließend dürfen Python-Entwickler das Tool sogar direkt aus eigenen Python-Skripten aktivieren (siehe Kasten “Integrationshilfe”).
Integrationshilfe
Frosted stellt ein einfaches Python-API mit drei Funktionen bereit. Über dies kann der Python-Entwickler die Prüfung aus einem Python-Skript heraus anwerfen. Dazu bindet er zunächst die von Frosted bereitgestellten Funktionen ein:
from frosted.api import *
Anschließend prüft der folgende Aufruf den Inhalt der Python-Datei »beispiel1.py« :
check_path("beispiel1.py")
Der folgende Funktionsaufruf untersucht hingegen alle Dateien in den Unterverzeichnissen von »/home/tim/beispiel/« :
check_recursive(["/home/tim/beispiel"])
»check_recursive« erwartet dabei eine Liste mit Verzeichnisnamen, die es jeweils rekursiv durchläuft. Der dritten Funktion im Bunde übergeben Entwickler den zu prüfenden Python-Code direkt als String:
meincode= "print hello" check(meincode, "pruefung1")
Den zweiten String (»pruefung1« ) setzt »check« dabei vor jede Fehlermeldung. Auf diese Weise können Entwickler mehrere Prüfvorgänge einfacher auseinanderhalten. Sofern der Code aus einem anderen Skript stammt, sollten Entwickler deshalb als zweiten Parameter den zugehörigen Dateinamen angeben.
Bitte ignorieren
Über den Parameter »-s« lassen sich einzelne Dateien oder Verzeichnisse von der Prüfung ausnehmen. Im folgenden Beispiel ignoriert Frosted »beispiel.py« :
frosted -s beispiel.py *.py
Wer nicht bei jedem Aufruf den kompletten Parameter »-s« eintippen möchte, der kann die auszuschließenden Dateien auch in der Konfigurationsdatei »~/.frosted.cfg« auflisten (dabei ist der vorangestellte Punkt im Dateinamen zu beachten). Diese Datei besitzt den Aufbau aus Listing 1.
Listing 1
Konfigurationsdatei ~/.frosted
01 [settings] 02 skip=ausschluss1.py,unwichtig2.py 03 ignore_frosted_errors=E100,W201 04 run_doctests=True
Nachsicht
Hinter »skip=« stehen, jeweils durch Kommata getrennt, alle von Frosted zu ignorierenden Dateien und Verzeichnisse. Des Weiteren können Anwender das Tool anweisen bestimmte Fehler zu übersehen. Dazu tragen sie die betreffenden Fehlernummern hinter »ignore_frosted_errors=« ein. Die einzelnen Nummern trennen sie ebenfalls mit Kommata. Einige Fehlernummern sind in Tabelle 1 aufgelistet.
Tabelle 1
Ausgewählte Fehlernummern
|
Fehlernummer |
Bedeutung |
|---|---|
|
Informationen |
|
|
I100 |
Alle allgemeinen Informationen |
|
I101 |
»Generic« |
|
Fehler |
|
|
E100 |
Alle Import-Fehler |
|
E101 |
»UnusedImport« |
|
E102 |
»ImportShadowedByLoopVar« |
|
E103 |
»ImportStarUsed« |
|
E200 |
Alle Fehler, die sich auf Funktionen und deren Aufrufe beziehen |
|
E201 |
»MultipleValuesForArgument« |
|
E202 |
»TooFewArguments« |
|
E203 |
»TooManyArguments« |
|
E300 |
Alle Fehler, die sich auf die Definition und Benutzung von Variablen beziehen |
|
E400 |
Alle Syntax-Fehler |
|
E401 |
»DoctestSyntaxError« |
|
E402 |
»PythonSyntaxError« |
|
Warnungen |
|
|
W100 |
Exception-Warnungen |
|
W200 |
Handling-Warnungen |
|
W201 |
»FileSkipped« |
Fehlernummern mit einer Null am Ende schließen alle anderen Fehler aus einer Serie mit ein. Die Angabe der Fehlernummer E100 würde folglich alle Import-Fehler (E101, E102 und E103) unterdrücken. Die Fehlernummern lassen sich auch an der Kommandozeile hinter dem Parameter »-i« an Frosted übergeben.
Legen Entwickler die Datei »~/.frosted.cfg« im Homeverzeichnis ab, gelten ihre Vorgaben bei jedem Aufruf von Frosted. Alternativ können sie für jedes Projekt eine eigene Konfigurationsdatei erstellen und diese im zugehörigen Verzeichnis platzieren. Rufen sie Frosted dann in diesem Verzeichnis auf, verwendet es die dortige Konfigurationsdatei.
Darüber hinaus wertet Frosted eine eventuell vorhandene »setup.cfg« -Datei aus. In ihr müssen Entwickler lediglich einen Abschnitt »[frosted]« hinzufügen, in dem sie dann wiederum die bekannten Einstellungen aus Listing 1 verwenden. Außerdem unterstützt das Tool den Editorconfig-Standard [3]. Setzen ihn Entwickler in ihren Projekten ein, können sie einfach im Abschnitt »*.py« der Datei »~/.editorconfig« die von Frosted verstandenen Parameter einsetzen. In jedem Fall lassen sich die Vorgaben über die bereits vorgestellten Kommandozeilen-Parameter überschreiben.
Die Entwickler möchten Frosted nach und nach auch in Entwicklungsumgebungen und Texteditoren integrieren. Derzeit lässt sich das Tool allerdings nur direkt aus Vim aufrufen. Hierzu installieren Anwender das Syntastic-Plugin [4].
Ausblick
Die Arbeit an Frosted schreitet derzeit rasch voran: Seit Anfang des Jahres gab es bereits 16 Releases. Timothy Crosley verspricht zudem einen offenen Entwicklungsprozess, jeder soll Verbesserungen einbringen können. So steht der Quellcode offen auf Github [2] bereit. Dort können Anwender auch um Hilfe bitten oder neue Funktionen vorschlagen. Weitere Diskussionen laufen über die Python Code-Quality-Mailingliste [5]. Schließlich darf man Timothy Crosley auch direkt per E-Mail kontaktieren.
Infos
- Pyflakes: https://github.com/pyflakes/pyflakes
- Frosted: https://github.com/timothycrosley/frosted
- Editorconfig: http://editorconfig.org
- Syntastic: https://github.com/scrooloose/syntastic
- Python Code Quality Mailingliste: https://mail.python.org/mailman/listinfo/code-quality






