PyDay: Erste Schritte (3)

Letzte Änderung am 25. Januar 2016 by Christoph Jüngling

In den ersten beiden Folgen (1, 2) dieser Artikelserie haben wir die Grundlagen gelegt: Das Projekt ist eingerichtet, steht unter Quellcodeverwaltung und es existiert bereits ein rudimentäres Modul. Dieses Modul wollen wir nun um eine Standardschnittstelle für die Kommandozeile erweitern.

Hauptfunktion mit Rückgabewert

Hilfreich (weil übersichtlicher) ist es, die Kernfunktionalität eines Programmes in einer zentralen Funktion zu halten. Daher legen wir zunächst eine Funktion an, die nun gerne “main” heißen darf (Zeile 3). Diese bekommt einen Doc-String (Zeilen 4-6) und definiert einen Rückgabewert (Zeile 7).

Damit der Rückgabewert letztlich auch die Kommandozeile erreicht, muss er mit einem speziellen Befehl an das Betriebssystem zurückgegeben werden. Diesen Befehl importieren wir aus der Bibliothek “sys” (Zeilen 1 und 10).

Die Zeile 9 bleibt unverändert erhalten. Sie sorgt dafür, dass überhaupt etwas ausgeführt wird, denn die Funktion “main” würde ohne deren Hilfe nichts tun können. Python setzt den internen Namen __main__ (ja, mit zwei Unterstrichen davor und danach) automatisch für das von dem Interpreter gestartete Hauptmodul ein.

import sys

def main():
    '''
    Hauptprogramm der Kaffeemaschine
    '''
    return 0

if __name__ == '__main__':
    sys.exit(main())

Hashwert: b496906

Parameter von der Kommandozeile lesen

Um dies zu erreichen, gäbe es zwar auch eingebaute Möglichkeiten von Python. Doch ich will eine um ein Vielfaches elegantere Variante zeigen. Erneut benötigen wir eine Bibliothek, diesmal heißt sie argparse. Diese bietet unter anderem den ArgumentParser an, der uns helfen wird, die Schnittstelle zur Kommandozeile nicht nur benutzerfreundlich zu gestalten, sondern die Argumente auch in einer “pythonic” genannten Form für die weitere Verarbeitung bereitzustellen. Aus Gründen der Übersichtlichkeit werden alle dafür notwendigen Befehle wieder in einer separaten Funktion zusammengefasst.

from argparse import ArgumentParser

def ParseCommandLine():
    parser = ArgumentParser(prog='Kaffeemaschine')
    # ... weitere Definitionen ...
    args = parser.parse_args()
    return(args)

An die Stelle, wo im obigen Listing “weitere Definitionen” steht, kommt nun in der Tat dieses hin. Hier definieren wir, welche Parameter wir auf der Kommandozeile erwarten oder zumindest erlauben. Dazu müssen wir uns zunächst darüber klar werden, was wir von der Kaffeemaschine eigentlich erwarten.

Erwartungshaltung

Die einfachste Erwartung an eine Kaffeemaschine ist sicher, dass sie Kaffee kocht. Dazu muss sie von uns gesagt bekommen, welche Sorte und welche Menge gekocht werden soll. Betrachten wir beide Informationen als “optional”, dann müssen wir sinnvolle Standardwerte dafür einsetzen.

Ich definiere also:

  • Menge: max. 1 Liter, default 1 Liter
  • Sorte: (freie Texteingabe), default “Arabica”

Wir benötigen dafür also einen numerischen und einen textuellen Parameter. Unsere “weiteren Definitionen” sehen also folgendermaßen aus:

parser.add_argument('-m', '--menge', default = 1, help = 'Gewünschte Kaffeemenge in Litern (default: 1 l)')
parser.add_argument('-s', '--sorte', default = 'Arabica', help = 'Gewünschte Kaffeesorte (default: Arabica)')

Am Ende müssen wir nur noch im Hauptprogramm aufrufen, um dort die Argumente zu erhalten. Das Ergebnis findet ihr in Changeset bf84cbd. Wie man auf die Argumente zugreift, seht ihr in Changeset c3c9986.

Ähnliche Artikel:

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

15 − sechs =