2016-05-21 3 views
7

Ist es möglich, argparse zu verwenden, um eine beliebige Menge von optionalen Argumenten zu erfassen?Ist es möglich, argparse zu verwenden, um eine beliebige Menge optionaler Argumente zu erfassen?

Zum Beispiel die beiden folgenden sollte als Eingaben akzeptiert werden:

python script.py required_arg1 --var1 value1 --var2 value2 --var3 value3 

python script.py required_arg1 --varA valueA --var2 value2 --varB valueB 

a priori Ich weiß nicht, welche optionalen Argumente angegeben erhalten werden würde, aber würde sie entsprechend behandeln.

Antwort

8

Diese Art von hackish Art und Weise ist, aber es funktioniert sehr gut:

Überprüfen Sie, welche Argumente nicht hinzugefügt werden, und fügen Sie sie

hinzu
parser=argparse.ArgumentParser() 
parser.add_argument("foo") 
parser.add_argument("-bar", type=int) 
#parser can have any arguments, whatever you want! 

parsed, unknown = parser.parse_known_args() #this is an 'internal' method 
# which returns 'parsed', the same as what parse_args() would return 
# and 'unknown', the remainder of that 
# the difference to parse_args() is that it does not exit when it finds redundant arguments 

for arg in unknown: 
    if arg.startswith(("-", "--")): 
     #you can pass any arguments to add_argument 
     parser.add_argument(arg, type=<your type>, ...) 

args=parser.parse_args() 

Zum Beispiel:

python arbitrary_parser.py ha -bar 12 -lol huhu -rofl haha 

Dann wäre das Ergebnis

args = Namespace(bar=12, foo='ha', lol='huhu', rofl='haha') 
+3

Einer der früheren Antworten früher 'parse_known_args', aber dann verwendet, um die' sys.argv' Stil für Parsen der 'Unbekannte'. Ich mag Ihre Idee, diese Flags dem Parser hinzuzufügen und erneut zu analysieren. Hackish-Anforderungen erfordern Hack-Lösungen. :) – hpaulj

3

Möglich? möglicherweise, aber ich würde es nicht empfehlen. argparse ist das nicht beste Werkzeug zum Parsen dieser Art von Eingabe, oder umgekehrt, dies ist eine schlechte Argument-Spezifikation aus einer argparse Perspektive.

Haben Sie darüber nachgedacht, wie die Linie usage aussehen sollte? Wie würde dies Ihren Benutzern erklären?

Wie würden Sie diese Arbeit von sys.argv direkt analysieren? Es sieht aus wie Sie 3 Stücke sammeln konnte:

prog = sys.argv[0] 
arg1 = sys.argv[1] 
keys = sys.argv[2::2] 
# maybe strip -- off each 
values = sys.argv[3::2] 
kvdict = {k:v for k, v in zip(keys, values)} 

Es gibt noch andere SO Fragen zu Generika key:value Paare zu fragen. Dinge wie:

--args key1:value1 key2:value2 

mit nargs='*' und eine Aktion, die jede Eingabekette spaltet auf : (oder =) und speichert die Dinge gehandhabt werden durch key Dies kann.

Ihre Anforderung ist am wenigsten zugänglich für argparse verwenden, da es die ganze Idee der übereinstimmenden Argument Flags mit Zeichenfolgen in argv umgehen muss. Es erfordert, einige wie, alle normalen argparse Parsing ausschalten.

Sieht aus wie ich die gleiche Sache ein paar Jahren vorgeschlagen vor

Parse non-pre-defined argument

oder früher

Using argparse to parse arguments of form "arg= val"

Verwandte Themen