Command
Command repräsentiert eine ausführbare Operation in einer CLI. Befehle leben direkt in
einer Application und sind der wichtigste Weg, benannte Aktionen für den Nutzer
bereitzustellen.
Application
└── Command ← du bist hier
├── Argument
├── Option
└── Subcommand
├── Argument
└── Option
Subcommand erbt von Command und wird für verschachtelte Befehlsbäume verwendet. Er
verhält sich identisch zu einem Command, ist aber unter einem übergeordneten Befehl und
nicht direkt unter der Application eingehängt.
Bestandteile eines Befehls
- ein öffentlicher Befehlsname
- Hilfetext (explizit angegeben oder aus einem Docstring abgeleitet)
- Definitionen positionaler Argumente
- Definitionen benannter Optionen
- optionale Definitionen verschachtelter Subcommands
- ein aufrufbares Handler-Objekt
Verantwortlichkeiten
Ein Befehl parst die zu ihm gehörenden Tokens, validiert die geparsten Werte anhand der Ressourcendefinitionen, bindet Werte an die Handler-Signatur und führt den Handler aus.
Namensverhalten
Befehle werden unter eindeutigen Namen registriert. Funktionsnamen werden durch das Ersetzen von Unterstrichen durch Bindestriche normalisiert, sofern kein Name ausdrücklich angegeben wurde.
Einfaches Befehlsbeispiel
from quickli import Application, Argument, Option
app = Application(name="demo")
@app.command(
help_text="Jemanden begrüßen.",
arguments=[Argument("name")],
options=[Option("shout", is_flag=True)],
)
def greet(name: str, shout: bool = False) -> str:
msg = f"Hello, {name}!"
return msg.upper() if shout else msg
print(app.run(["greet", "Alice"])) # Hello, Alice!
print(app.run(["greet", "Alice", "--shout"])) # HELLO, ALICE!
Beispiel für verschachtelte Subcommands
Verwende Subcommand, wenn ein Befehl natürlich weitere Aktionen gruppiert, etwa
env create und env delete.
from quickli import Application, Argument, Subcommand
app = Application(name="demo")
@app.command(
name="env",
subcommands=[
Subcommand(
name="create",
arguments=[Argument("name")],
handler=lambda name: f"created:{name}",
)
],
)
def env() -> str:
return "env"
print(app.run(["env", "create", "dev"]))
Tipps
:::tip Command vs. Subcommand
Verwende einen Top-Level-@app.command für voneinander unabhängige Aktionen wie build
und clean. Verwende einen Subcommand, wenn Aktionen logisch einen gemeinsamen
Namensraum teilen, z. B. env create, env list und env delete.
:::
:::tip Hilfetext aus Docstrings
Wenn du kein help_text übergibst, verwendet quickli automatisch den Docstring der
Funktion. Dadurch bleibt der Handler-Code selbst dokumentierend.
@app.command()
def build() -> str:
"""Das Projekt bauen und ein Release-Artefakt erzeugen."""
return "building…"
:::
Wie geht es weiter?
- Füge Arguments hinzu, um positionelle Eingaben anzunehmen.
- Füge Options hinzu, um benannte Flags und Werte anzunehmen.
- Geh zurück zu Application, um zu verstehen, wie Befehle weitergeleitet werden.
