Programmierpraktikum SoSe 2024, Bachelor Informatik, FU Berlin
ProPra2024 > Bibliotheken > Frameworks > argparse_subcommand

argparse_subcommand, ein sehr einfaches Framework

Trial
Product

Ziel

  • Ich verstehe, was ein Framework ausmacht und habe eines ausprobiert.
  • Ich kann mit argparse_subcommand aufgeräumte Kommandozeilenprogramme mit mehreren Unterkommandos schreiben.
  • Ich habe die Programmstruktur für mehrere nachfolgende Aufgaben angelegt.

Hintergrund

Das Modul argparse ist schick, um Kommandozeilen mit zahlreichen Optionen gut verarbeiten zu können. Wenn das Kommando allerdings mehrere Unterkommandos hat (wie z.B. git mit seinen Befehlen add, commit, push usw.) wird es kompliziert: Dann muss man je nach gegebenem Unterkommandonamen den ArgumentParser ganz anders konfigurieren.

argparse_subcommand ist ein klitzekleines Framework, um das zu vereinfachen. Es gibt eine feste Programmstruktur für die Unterkommandos vor, was beim Programmieren ein bisschen Code einspart, vor allem aber zu einer immer gleichen und deshalb schnell verständlichen Gesamtstruktur führt.

In dieser Aufgabe lernen wir argparse_subcommand sowohl, um zu verstehen, was ein Framework ist, als auch als nettes Hilfsmittel für späteres Programmieren.

Loose

Arbeitsschritte

Installieren

  1. Verwenden Sie pip, um das Paket argparse_subcommand in Ihr venv zu installieren.

In argparse_subcommand einlesen: Was ist ein Framework?

  1. Lesen und verstehen Sie die kurze Dokumentation von argparse_subcommand.
    Der Frameworkcharakter besteht darin, dass der Aufruf von parser.execute_subcommand(args) (dieser Teil steht im Hauptprogramm Ihres Programms) bewirkt, dass in einem der subcommand-Module execute(args) aufgerufen wird, ohne, dass Sie einen solchen Aufruf irgendwo hingeschrieben hätten.

mlh: Struktur aufbauen

  1. Legen Sie einen Ordner mlh an. mlh steht für "my little helpers" und ist der Name des Programms, das wir in den nachfolgenden Aufgaben dieser Aufgabengruppe entwickeln werden.
    In einer Standard-Python-Paketstruktur ist dies der Projektordner.
  2. Legen Sie in diesem Ordner einen Unterordner gleichen Namens, mlh, an und darin eine leere Datei __init__.py. Das macht den Ordner zu einem Python-Modul, Dieses Modul bildet den Namensraum (mlh), in dem wir überwiegend programmieren wollen. Wenn wir eine Bibliothek bauen würden (nicht ein Kommandozeilen-Programm), würde sich alles in diesem Modul abspielen. In unserem Fall brauchen wir aber noch ein Hauptprogramm:
  3. Legen Sie in diesem Unterordner die Datei __main__.py an und implementieren Sie darin das kurze Hauptprogramm wie in der Dokumentation von argparse_subcommand beschrieben.
    Ergänzen Sie darin den fehlenden Import, sowie
    explanation = "My Little Helpers: a collection of small utility programs"
  4. Legen Sie ein Untermodul mlh.subcmds für die subcommands an: Unterordner subcmds, Datei __init__.py.
    __init__.py legt die Schnittstelle des Moduls fest und bleibt bei uns leer, weil wir nur an den Unter-Untermodulen interessiert sind, nicht an subcmds selbst.
  5. Legen Sie darin zwei Dateien gitac.py und lsnew.py an; das werden die beiden ersten Subcommands für mlh. Kopieren Sie in jede der Dateien den subcommand-Modul-Basiscode aus der argparse_subcommand-Dokumentation und formatieren Sie ihn ordentlich.
  6. 1 Rufen Sie python mlh auf und überzeugen Sie sich, dass beide Unterkommandos vom Framework korrekt erkannt werden.
  7. 2 Rufen Sie python mlh gitac auf und überzeugen Sie sich, dass das Unterkommando aufgerufen werden kann (und natürlich noch gar nichts tut).

mlh: Struktur ausprägen

In dieser Aufgabe legen wir erst mal nur die Kommandostruktur der beiden Unterkommandos an, aber noch ohne richtige Implementierung.

  1. Tragen Sie als Implementierung von execute bei beiden Unterkommandos ein
    print(args).
  2. 3 Rufen Sie erneut python mlh gitac auf und überzeugen Sie sich, dass die gewünschte Meldung erscheint.
  3. Ergänzen Sie nun subcmds.gitac.add_arguments() so, dass Sie auf python mlh gitac --help die Hilfezeile "usage: mlh gitac [-h] [-m commit msg] file [file …]" erhalten und alternativ auch --message anstatt -m akzeptiert wird.
  4. 4 Zeigen Sie folgende gültige Kommandos und ihre Ausgaben:
    python mlh gitac file1
    python mlh gitac file1 file2
    python mlh gitac -m "my commit message" file1 file2
    python mlh gitac --message "other msg" file1 file2 file3
  5. 5 Zeigen Sie folgende ungültige Kommandos und ihre Ausgaben:
    python mlh gitac
    python mlh gitac -m file1
  6. Ergänzen Sie nun subcmds.lsnew.add_arguments() so, dass Sie auf python mlh lsnew --help die Hilfezeile "usage: mlh lsnew [-h] [–age maxage] file [file …]" erhalten und age den Standardwert "48h" hat`.
  7. 6 Zeigen Sie folgende gültige Kommandos und ihre Ausgaben:
    python mlh lsnew file1
    python mlh lsnew --age 30s file1 file2
Trace

Abgabe

Geben Sie ein Kommandoprotokoll ab, das genau nur die Eingaben und Ausgaben der obigen Kommandos 1, 2, … enthält. Entfernen Sie vor Abgabe eventuelle Fehlversuche und sonstige zusätzliche Kommandos aus dem Protokoll.

Geben Sie den Dateibaum mlh mit seinen diversen *.py-Dateien ab.