argparse-Ergebnis an eine Funktion uebergeben?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Tach!

Ich versuche mich gerade an einem Script mit argparse (wobei meine Stolperstelle per optparse genauso vorhanden waere) und haenge da an einer Stelle:

mein Script soll einerseits als Modul funktionieren, aber auch beim Commandline-Aufruf was machen. Deshalb steckt der Hauptteil der Funktionalitaet in einer Funktion und ueber ne "__name__ == '__main__'"-Abfrage realisiere ich den Commandline-Teil. Soweit so gut. Meine Funktion sieht nun etwa so aus:

Code: Alles auswählen

def myfunc(varA, varB = 123, varC = 456, varD = True, varE = 789)
eine Variable ist also zwingend erforderlich, die anderen haben Defaultwerte und muessen deshalb nicht zwingend uebergeben werden.

Im __main__-Teil frag ich nun per argparse die Commandline ab und hab da auch alle obigen Variablen als positionale und optionale Parameter angelegt:

Code: Alles auswählen

parser = argparse.ArgumentParser()
parser.add_argument('varA')
parser.add_argument('-b', '--varB')
...
args = parser.parse_args()
Aber wie uebergebe ich denn die optionalen Parameter nun sauber an meine obige Funktion? Denn sowas hier funktioniert ja nicht:

Code: Alles auswählen

result = myfunc(varA = args.varA, varB = args.varB, varC = args.varC, varD = args.varD, varE = args.varE)
denn wenn ich in der Commandline einen der optionalen Parameter nicht angebe, wird der ja nicht NICHT uebergeben, sondern es wird None uebergeben und ich hab in der Funktion dann statt meinem Defaultwert, den ich eigentlich gern haette, ploetzlich den Wert None drinstehen.

Vermutlich ist schon die ganze Grundidee falsch, das so zu loesen. Aber ich steh da grad als Nicht-Python-Crack ziemlich wie der Ochs vorm Berg und hab null Idee, wie man das eigentlich richtig und moeglichst noch elegant loest. Packt man die Zuweisung der Defaultwerte woanders hin? Erzeugt man vorher schonmal alle Variablen fuer die Funktion und weist denen ueber lauter 'if args.varXY'-Konstruktionen nur dann andere Werte wenn der entsprechende Commandline-Parameter vorhanden ist? Oder ...?

Danke fuer jegliche Hinweise!

Abraham
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

@shakebox: argparse versteht auch default-Werte. Wenn Du diese angibst, so kann der Hilfetext ('--help') automatisch diese Defaultwerte mit ausgeben.
BlackJack

@shakebox: Du kannst doch dem Argparser für die Optionen auch einen Defaultwert geben. Das *muss* ja nicht `None` liefern wenn der Benutzer eine Option nicht angibt.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Ok, verstehe, stimmt. Dann muss ich aber an zwei Stellen Default-Werte pflegen, richtig? Denn fuer die Funktion will ich ja auch Defaultwerte haben, falls man die als Modul importiert und aufruft. Oder schreibt man die Defaultwerte dann besser ganz oben im Script erstmal in Variablen, die man an beiden Stellen dann einsetzt?

Und um diese ganze Aufrufzeile, wo ich jeden argparse-Parameter einem (evtl. sogar gleich lautenden) Funktions-Parameter uebergebe, komm ich nicht rum, oder kann man das eleganter loesen? Und ist das ueberhaupt sinnvoll, die gleich zu nennen oder macht Ihr bei sowas immer bewusst andere Namen? Klar ist es durch das vorangestellte 'args.' ja jeweils anders, aber in solchen Faellen frag ich mich immer ob das eher sinnvoll ist so zu loesen um klar zu wissen was zusammengehoert oder ob man das eben genau nicht macht.
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

@shakebox: fünf Parameter sind schon die Obergrenze, die ich einer Funktion übergeben würde, damit sie noch verständlich bleibt. Bei mehr müßtest Du überlegen, ob sich das Problem nicht in mehrere einfachere Teilprobleme zerlegen läßt.
Die Defaultwerte als Konstanten zu definieren ist bestimmt eine gute Idee. Dass die Namen von Argumenten und Parameter gleich sind stört auch nicht, da wenn Du schon einen passenden Namen gefunden hast, warum solltest Du ihn nicht mehrfach verwenden?
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Prima, danke schonmal!

Die Funktion erzeugt aus vielen Parametern einen Commandline-String fuer den Aufruf von FFMPEG, um aus ner Einzelbildsequenz nen Quicktime-Movie zu erzeugen. Dabei gibt es halt viele Parameter wie Timecodespur ja/nein, Texteinblendung ja/nein, Framerate, Fontsize, Font-Datei, etc.

Aber ja, ich muss mal schauen ob sich das noch besser in Unter-Funktionen aufteilen und dann erst zu nem Gesamtstring kombinieren laesst.
Antworten