Anleitung 5: Dateikopf (quickhead)
Diese Anleitung erstellt quickhead, ein minimales head-ähnliches Werkzeug, das die
ersten oder letzten Zeilen einer Datei ausgibt. Du lernst die numerische Konvertierung
mit converter=int und den eingebauten positive_number-Validator kennen.
Du lernst:
- rohe Optionsstrings mit
converter=intin Integer umzuwandeln - konvertierte Werte mit
positive_number()zu validieren - ein Flag für den Tail-Modus hinzuzufügen
Das vollständige Beispiel
Speichere die folgende Datei als quickhead.py:
from __future__ import annotations
from pathlib import Path
from quickli import Application, Argument, Option, file_path, positive_number
app = Application(
name="quickhead",
description="A tiny head-like CLI built with quickli.",
)
@app.entrypoint(
help_text=(
"Display the first few lines of a file. If no value is given, the first 10 "
"lines are displayed."
),
arguments=[Argument("file", validators=[file_path()])],
options=[
Option(
"lines",
short_name="n",
converter=int,
validators=[positive_number()],
help_text="Number of lines to display.",
),
Option(
"tailmode",
short_name="t",
is_flag=True,
help_text="Display the last few lines instead of the first.",
),
],
)
def head(file: Path, lines: int = 10, tailmode: bool = False) -> str:
content = file.read_text(encoding="utf-8").splitlines(keepends=True)
if tailmode:
return "".join(content[-lines:])
return "".join(content[:lines])
if __name__ == "__main__":
print(app.run())
Ausführen
# Die ersten 10 Zeilen ausgeben (Standard)
python quickhead.py README.md
# Die ersten 5 Zeilen ausgeben
python quickhead.py README.md --lines 5
python quickhead.py README.md -n 5
# Die letzten 3 Zeilen ausgeben
python quickhead.py README.md -n 3 --tailmode
python quickhead.py README.md -n 3 -t
Erklärung Zeile für Zeile
Numerische Konvertierung
Option(
"lines",
short_name="n",
converter=int,
validators=[positive_number()],
help_text="Number of lines to display.",
),
Die Kommandozeile liefert immer rohe Strings. converter=int weist quickli an, vor der
Übergabe an den Handler int() auf den Wert anzuwenden. Schlägt die Konvertierung fehl,
etwa bei --lines abc, erzeugt quickli vor dem Handler-Aufruf eine klare Fehlermeldung.
Als Konverter kannst du jeden aufrufbaren Wert verwenden — int, float, Path oder
deine eigene Funktion.
Der positive_number-Validator
positive_number() läuft nach dem Konverter und erhält daher einen int. Er löst einen
ValueError aus, wenn der Wert nicht positiv, also nicht größer als null, ist. Der
Handler kann deshalb von lines >= 1 ausgehen.
Standardwert für eine konvertierte Option
def head(file: Path, lines: int = 10, tailmode: bool = False) -> str:
Der Standardwert für lines ist 10. Wenn die Option fehlt, erhält der Handler direkt
10; für den Standardwert ist keine Konvertierung erforderlich, da quickli den Konverter
nur auf vom Benutzer gelieferte Werte anwendet.
Tail-Modus
if tailmode:
return "".join(content[-lines:])
return "".join(content[:lines])
Der negative Python-Slice content[-lines:] gibt die letzten lines Elemente zurück.
So lassen sich Kopf und Ende derselben Datei sauber in einem Handler umsetzen.
Was du als Nächstes ausprobieren kannst
- Füge eine Option
--byteshinzu, die die ersten N Bytes statt Zeilen ausgibt. - Lies Anleitung 6: CLI mit mehreren Befehlen, um benannte Befehle und globale Anwendungsoptionen kennenzulernen.
