argparse argument, um
Ich habe ein kleines problem.
Benutze ich argparse
zu analysieren, meine Argumente, und es funktioniert sehr gut.
Haben die args, ich weiß :
p_args = parser.parse_args(argv)
args = dict(p_args._get_kwargs())
Aber das problem mit p_args
ist, dass ich nicht weiß, wie man diese Argumente in der Reihenfolge Ihrer position in der Befehlszeile, weil es ein dict.
Also gibt es keine Möglichkeit, die Argumente in einem Tupel/Liste/bestellt dict nach Ihrer Reihenfolge in der Kommandozeile?
- Es würde helfen, zu sehen, der code zeigt, wie Sie Sie eingerichtet haben-parser.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Halten Argumente bestellt, ich benutze eine benutzerdefinierte Aktion wie folgt:
Um es zu verwenden, zum Beispiel:
Wenn Sie brauchen, um zu wissen, in welcher Reihenfolge die Argumente erscheinen in Ihre parser können Sie den parser so:
Hier ein kurzes Beispiel für diesen code ausführen:
Beachten Sie, dass
args.positionals
ist eine Liste mit den positions-Argumenten in der Reihenfolge. Finden Sie die argparse-Dokumentation für weitere Informationen.Dies ist ein wenig instabil, da es stützt sich auf das Verständnis der Interna
argparse.ArgumentParser
, aber statt der Umschreibungargparse.ArgumentParser.parse_known_args
, hier ist, was ich verwenden:Diese Werke durch die Erkenntnis, dass
argparse.ArgumentParser.parse_known_args
zieht sich durch die gesamte Liste der Optionen einmal, festlegen von Standardwerten für jedes argument. Was bedeutet, dass Benutzer angegebenen Argumenten beginnen, die erste Zeit__setattr__
trifft ein argument, dass es zuvor gesehen.Verwendung:
Können Sie überprüfen
options._arg_order
für die Bestellung von Benutzer angegebene Befehlszeile Argumente oder verwenden Sieoptions._latest_of("arg1", "arg2")
um zu sehen, welche--arg1
oder--arg2
angegeben wurde später auf der Befehl-Linie (die, für meine Zwecke war das, was ich gebraucht habe: zu sehen, welche der beiden Optionen wäre das überschreiben einer).UPDATE: hinzufügen musste
_finalize
Methode, mit der pathologischen Fall vonsys.argv()
enthält nicht alle Argumente in der Liste)Gibt es module, die speziell zum verarbeiten dieser :
https://github.com/claylabs/ordered-keyword-args
ohne Verwendung orderedkwargs Modul
Ausgabe:
Auf mit orderedkwargs Modul
Ausgabe:
Hinweis: Single-asterik erforderlich ist, während der Verwendung dieses Moduls mit dem Symbol über die Funktion.
Ich brauchte das, weil, für logging-Zwecke, ich mochte drucken Sie die Argumente nach wurden Sie analysiert. Das problem war, dass die Argumente nicht in der angegebenen Reihenfolge gedruckt, das war wirklich nervig.
Benutzerdefinierte Aktion Klasse nur flat-out hat nicht funktioniert für mich. Ich hatte andere Argumente, die verwendet eine andere Aktion wie
'store_true'
unddefault
Argumente auch nicht funktionieren, da die benutzerdefinierten Aktion Klasse wird nicht aufgerufen, wenn das argument nicht gegeben ist, in der Befehlszeile. Was für mich gearbeitet wurde die Erstellung einer wrapper-Klasse wie folgt aus:Die Profis sind, dass die
add_argument
Methode sollte die gleiche Funktionalität wie das originalArgumentParser
. Die Nachteile sind, dass, wenn Sie möchten, dass andere Methoden, die Sie haben, um zu schreiben gewickelt für alle von Ihnen. Zum Glück für mich alle, die ich je benutzt wurdeadd_argument
undparse_args
, so ist dies diente meine Zwecke ziemlich gut. Sie würden auch brauchen, um mehr Arbeit erledigen, wenn Sie wollte übergeordnetenArgumentParser
s.