Seite 1 von 1

argparse-Ergebnis an eine Funktion uebergeben?

Verfasst: Mittwoch 21. Mai 2014, 16:10
von shakebox
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

Re: argparse-Ergebnis an eine Funktion uebergeben?

Verfasst: Mittwoch 21. Mai 2014, 16:16
von Sirius3
@shakebox: argparse versteht auch default-Werte. Wenn Du diese angibst, so kann der Hilfetext ('--help') automatisch diese Defaultwerte mit ausgeben.

Re: argparse-Ergebnis an eine Funktion uebergeben?

Verfasst: Mittwoch 21. Mai 2014, 16:17
von 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.

Re: argparse-Ergebnis an eine Funktion uebergeben?

Verfasst: Mittwoch 21. Mai 2014, 16:24
von shakebox
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.

Re: argparse-Ergebnis an eine Funktion uebergeben?

Verfasst: Mittwoch 21. Mai 2014, 16:59
von Sirius3
@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?

Re: argparse-Ergebnis an eine Funktion uebergeben?

Verfasst: Mittwoch 21. Mai 2014, 17:15
von shakebox
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.