Ich denke, dass Sie diesen Konflikthandler in unbeabsichtigtes und unerprobtes Territorium drängen. Normalerweise sind parents
eigenständige Parser, die nicht verwendet werden. Sie sind nur eine Quelle für Actions
. Und Konflikte bezüglich -h
werden mit add_help=False
behandelt.
Als Hintergrund: mit dem Standard conflict_handler
(Fehler) Fehlermeldungen erhalten würde, wenn die Erstellung der wrappercommand
subparser:
argparse.ArgumentError: argument -h/--help: conflicting option string(s): -h, --help
und nach einiger add_help=False
Zugabe, dann würden Sie noch erhalten:
argparse.ArgumentError: argument --config: conflicting option string(s): --config
Der resolve
Konflikthandler ersetzt die Fehlermeldungen durch eine Art "Auflösung". Das folgende Skript zeigt, was passiert.
Der Handler resolve
löschte die option_strings
für die Aktionen subcommand1
, während die Aktionen bestehen bleiben. In der Tat werden beide zu Positionalen. Und da help
nargs=0
hat, wird es immer ausgeführt. Daher wird die Hilfe angezeigt.
Die Absicht von _handle_conflict_resolve
ist, Beweise des ersten Arguments zu entfernen, so dass das neue Argument hinzugefügt werden kann. Das funktioniert gut, wenn der Konflikt durch zwei add_argument
Befehle mit den gleichen Optionsstrings erzeugt wird. Aber hier entsteht der Konflikt, indem Aktionen von zwei Eltern "kopiert" werden. Die übergeordneten Aktionen werden jedoch als Verweis kopiert, sodass Änderungen am "untergeordneten" sich auf das "übergeordnete Element" auswirken.
Einige mögliche Lösungen: direkt
die Argumente wrappercommand
hinzuzufügen. Dieser parents
Mechanismus fügt nur Argumente von den Eltern zum Kind hinzu. Es "läuft" die Eltern nicht sequenziell.
Schreiben Sie Ihre eigene _handle_conflict_...
Funktion, um den Konflikt korrekt zu lösen.
Entfernen Sie die Konflikte, so dass Sie die parents
ohne den resolve
Handler verwenden können.
ich einen Fehlerbericht mit diesem Beispiel eingereicht http://bugs.python.org/issue22401:
parent1 = argparse.ArgumentParser(add_help=False)
parent1.add_argument('--config')
parent2 = argparse.ArgumentParser(add_help=False)
parent2.add_argument('--config')
parser = argparse.ArgumentParser(parents=[parent1,parent2],
conflict_handler='resolve')
def foo(parser):
print [(id(a), a.dest, a.option_strings) for a in parser._actions]
foo(parent1)
foo(parent2)
foo(parser)
, die produziert:
[(3077384012L, 'config', [])]
[(3076863628L, 'config', ['--config'])]
[(3076864428L, 'help', ['-h', '--help']), (3076863628L, 'config', ['--config'])]
Notiere die fehlende option_strings
für parent1
und die passende id
für die anderen 2. parent1
kann nicht erneut als Parent oder Parser verwendet werden.
argparse - Combining parent parser, subparsers and default values ist ein weiterer Fall, in der Aktion des Kopierens Elternteil durch Bezugnahme Komplikationen (in wechselnder Defaults) erzeugt.
Können Sie den vollständigen Parsing-Code posten? Ist das Argument "Helfer"? – Forge
Das ist ein Tippfehler - es sollte 'help = "Die Config"' sein. – hpaulj