Python-argparse optional sub-Argumente
Möchte ich ein argument für mein Programm, dass einige erforderliche Parameter zusammen mit einigen optionalen Parametern. So etwas wie dieses:
[--print text [color [size]]
also man könnte es passieren diesen:
mycommand --print hello
mycommand --print hello blue
mycommand --print hello red 12
Kann es mehrere von diesen, so muss es sein, eine einzelne add_argument. Zum Beispiel:
[--print text [color]] [--output filename [overwrite]]
Kann ich erreichen Argumenten, die nahe an dem, was ich will:
>>> parser = argparse.ArgumentParser()
>>> act = parser.add_argument('--foo', nargs=3, metavar=('x','y','z'))
>>> act = parser.add_argument('--bar', nargs='?')
>>> act = parser.add_argument('--baz', nargs='*')
>>> parser.print_help()
usage: [-h] [--foo x y z] [--bar [BAR]] [--baz [BAZ [BAZ ...]]]
optional arguments:
-h, --help show this help message and exit
--foo x y z
--bar [BAR]
--baz [BAZ [BAZ ...]]
aber nicht ganz. Gibt es eine Möglichkeit, dies zu tun mit argparse? Ich weiß, ich könnte machen Sie alle nargs="*"
aber dann --Hilfe würde nicht die Liste mit den Namen der optionalen Argumente. Wenn ich den pass nargs="*"
und ein Tupel für metavar, argparse wirft eine Ausnahme.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen der source code (start in
take_action
), ich glauben, was Sie wollen, ist unmöglich. Alle argument-parsing und Weitergabe an Maßnahmen erfolgt auf Basis nargs, und nargs ist entweder eine Zahl,OPTIONAL
("?"),ZERO_OR_MORE
("*"),ONE_OR_MORE
("+"),PARSER
, oderREMAINDER
. Diese müssen festgestellt werden, bevor die Aktion-Objekt (mit dem Eingang) auch noch sieht, was es immer, also kann es nicht dynamisch Abbildung ausnargs
.Denke ich, werden Sie brauchen, um zu Leben mit einem workaround. Ich würde vielleicht haben
--foo-x x
,--foo-y y
, und--foo-z z
, und vielleicht auch--foo x y z
.Wie etwa
Dann bekommen Sie so etwas wie dieses:
nargs='+'
odernargs='*'
, die bereits so nah, wie Sie kam. metavar können tatsächlich nehmen ein Tupel, sondern nur definieren zwei Namen (nicht drei). Auch Sie überschreiben könnte helfen, für so etwas wieparser.add_argument('--print', nargs='+', metavar=('text', 'color'), help='--print text [color [size]]')
Laut Devin Jeanpierre Antwort, es scheint, dass die Verwendung von '+' (ein oder mehr) statt " * " würde das tun, was Sie versuchen zu erreichen.
(PS: ich habe gerade kommentiert in seiner Antwort, wenn ich genügend Punkte)
die die Arbeit für einzelne arg: