Was ich brauche ist:
pro [-a xxx | [-b yyy -c zzz]]
Ich habe es versucht, aber es funktioniert nicht. Könnte mir jemand helfen?
group= parser.add_argument_group('Model 2')
group_ex = group.add_mutually_exclusive_group()
group_ex.add_argument("-a", type=str, action = "store", default = "", help="test")
group_ex_2 = group_ex.add_argument_group("option 2")
group_ex_2.add_argument("-b", type=str, action = "store", default = "", help="test")
group_ex_2.add_argument("-c", type=str, action = "store", default = "", help="test")
Vielen Dank!
Antworten:
add_mutually_exclusive_group
schließt nicht aus, dass sich eine ganze Gruppe gegenseitig ausschließt. Optionen innerhalb der Gruppe schließen sich gegenseitig aus.Was Sie suchen, sind Unterbefehle . Anstelle von prog [-a xxxx | [-b yyy -c zzz]] hätten Sie:
So rufen Sie mit den ersten Argumenten auf:
So rufen Sie mit dem zweiten Satz von Argumenten auf:
Sie können die Unterbefehlsargumente auch als positionell festlegen.
Ein bisschen wie git oder svn:
Arbeitsbeispiel
Probier es aus
Viel Glück.
quelle
[[-a <val>] | [-b <val1> -c <val2>]]
[-a xxx | [-b yyy -c zzz]]
Während Jonathans Antwort für komplexe Optionen vollkommen in Ordnung ist, gibt es eine sehr einfache Lösung, die für die einfachen Fälle funktioniert, z. B. 1 Option schließt 2 andere Optionen wie in aus
oder sogar wie in der ursprünglichen Frage:
So würde ich es machen:
Ich verwende hier Optionen, die einem Befehlszeilen-Wrapper zum Abfragen eines Mongodb gegeben wurden. Die
collection
Instanz kann entweder die Methode aufrufenaggregate
oder die Methodefind
mit dem fakultativen Argumentequery
undfields
damit Sie sehen, warum die ersten beiden Argumente sind kompatibel und die letzte ist nicht.Jetzt laufe ich
parser.parse_args()
und überprüfe den Inhalt:Natürlich funktioniert dieser kleine Hack nur in einfachen Fällen und es wäre ein Albtraum, alle möglichen Optionen zu prüfen, wenn Sie viele sich gegenseitig ausschließende Optionen und Gruppen haben. In diesem Fall sollten Sie Ihre Optionen auf Befehlsgruppen aufteilen, wie von Jonathan vorgeschlagen.
quelle
parser.error("-a and -q ...")
. Auf diese Weise wird die vollständige Verwendungshilfe automatisch ausgedruckt.q
undf
in der ersten Gruppe erforderlich ist Benutzer, (2) eine der Gruppen ist erforderlich. Und das macht die "einfache" Lösung nicht mehr so einfach. Daher würde ich zustimmen, dass dies mehr Hack für handgefertigte Skripte ist, aber keine echte LösungEs gibt einen Python-Patch (in Entwicklung), mit dem Sie dies tun können.
http://bugs.python.org/issue10984
Die Idee ist, überlappende sich gegenseitig ausschließende Gruppen zuzulassen. So
usage
könnte aussehen:Das Ändern des Argparse-Codes, damit Sie zwei Gruppen wie diese erstellen können, war der einfache Teil. Das Ändern des
usage
Formatierungscodes erfordert das Schreiben eines benutzerdefinierten CodesHelpFormatter
.In wirken
argparse
sich Aktionsgruppen nicht auf das Parsen aus. Sie sind nur einhelp
Formatierungswerkzeug. In derhelp
Gruppe wirken sich gegenseitig ausschließende Gruppen nur auf dieusage
Zeile aus. Beim Parsen, dieparser
verwendet die sich gegenseitig ausschließende Gruppen ein Wörterbuch der möglichen Konflikte zu konstruieren (a
kann nicht auftreten , mitb
oderc
,b
kann mit nicht auftretena
, usw.), und dann wirft einen Fehler , wenn ein Konflikt entsteht.Ohne diese argparse Patch, ich denke , die beste Wahl , um den Namespace produziert zu testen , ist
parse_args
selbst (zB wenn beidea
undb
haben Nicht - Standardwerte), und heben Sie Ihre eigenen Fehler. Sie können sogar den eigenen Fehlermechanismus des Parsers verwenden.quelle