Python-Abhängigkeiten zwischen den Gruppen mit argparse

Begann ich zu lernen, Python, und jetzt Lerne ich die großen Vorteile der argparse.
Mit argparse habe ich zwei Gruppen von Argumenten: group_list und group_simulate. Jede der Gruppen hat Ihre eigenen Argumente-der Benutzer kann angeben, nur ein argument in jeder Gruppe (erreicht mit parser.add_mutually_exclusive_group()).

Und jetzt ist mein Ziel nicht vorhanden ist, kann ein syntax-Fehler, wenn der Benutzer die angegebenen Argumente von beiden groupgs und nicht von nur einer von Ihnen-und das möchte ich erreichen dies, indem mithilfe der Funktionen von argparse und nicht durch schreiben eine Methode, die fragt, ob dies und das angegeben wurde, drucken syntax-Fehler.

import argparse
parser = argparse.ArgumentParser(
        description='this is the description',
        epilog="This is the epilog",
        argument_default=argparse.SUPPRESS  
        )

parser.add_argument('-v', '--verbose', help='verbose', action='store_true', default=False)

group_list = parser.add_mutually_exclusive_group()
group_list.add_argument('-m', help='list only modules', action='store_const', dest='list', const='modules', default='all')
group_list.add_argument('-p', help='list only ports', action='store_const', dest='list', const='ports', default='all')
group_list.add_argument('--list', help='list only module or ports', choices=['modules','ports'], metavar='<modules/ports>', default='all')

group_simulate = parser.add_mutually_exclusive_group()
group_simulate.add_argument('-M', help='simulate module down', nargs=1, metavar='module_name', dest='simulate')
group_simulate.add_argument('-P', help='simulate FC port down', nargs=1, metavar='fc_port_name', dest='simulate')
group_simulate.add_argument('-I', help='simulate iSCSI port down', nargs=1, metavar='iSCSI_port_name', dest='simulate')
group_simulate.add_argument('--simulate', help='simulate module or port down', nargs=1, dest='simulate')

args = parser.parse_args()

print args

So reden, genauer gesagt:

erlaubt:

test.py
output: Namespace(list='all', verbose=False)
test.py -m
output: Namespace(list='modules', verbose=False)
test.py -P asfasf
output: Namespace(P=['asfasf'], list='all', verbose=False)

nicht erlaubt:

test.py -m -P asfsaf
expected output: <the help message>
test.py -P asfasf -m
expected output: <the help message>

Habe ich versucht zu erreichen, wollte den Gegner mit der option add_subparsers aus argparse aber ohne Erfolg.

Also meine Frage ist wie erreichen Sie diese situation?

  • was ist dann der Unterschied zu werfen, sich gegenseitig ausschließende Argumente in einer Gruppe?
  • Die Verwendung von mehreren sich gegenseitig ausschließenden Gruppen können Sie, zum Beispiel, vorbei an der required argument, um nur einige von Ihnen. Dass ein sich gegenseitig ausschließendes Gruppe können Sie nicht tun. Ein anderer Vorteil ist, dass die Hilfe, die Meldung ist ein wenig informativer, wenn Sie mehr als ein sich gegenseitig ausschließendes Gruppe. Auch in der Zukunft einige weitere Informationen über die sich gegenseitig ausschließenden Gruppe zur Verfügung gestellt werden könnten(z.B. Titel und Beschreibung), und somit wäre es mehr informative Hilfe-Nachrichten.
  • aber wenn man in der Gruppe ist required um eine arg, tut das nicht sofort ausschließen, alle anderen Gruppen?
  • Ich würde Zustimmen, das wenn ein argument ist definiert als required werden, wird dies in Konflikt mit der add_mutually_exclusive - da Sie haben Sie dieses argument angeben und nicht in der Lage zu spezifizieren, mit anderen Argumenten, ist dies, wie ich es verstehe. im obigen Fall hatte ich keine required Argumente.
  • Ich weiß nicht, warum diese Antwort wurde akzeptiert. Die OP besagt, dass Sie sollten in der Lage sein zu wählen, genau 1 -m, -p, --list UND genau 1 -M, -P, -I, --simulate. Diese Antwort macht das nicht.
  • Außerdem, ich weiß nicht, was der Punkt, der --list und --simulate allein sein könnte. Es scheint, dass das, was Sie EIGENTLICH wollen, ist entweder --list mit einem -m, -p oder --simulate mit einem -M, -P, -I. Dies ist, warum Sie sollten beginnen immer mit dem schreiben eine sinnvolle Nutzung-Anweisung zuerst. Bekommen es direkt in Ihrem Kopf und "auf dem Papier" zunächst. Anschließend können Sie code, oder zu kommunizieren, um Hilfe zu bekommen. Wenn Sie nicht schreiben können eine Verwendung der Aussage für es Sie entweder nicht wissen, POSIX, oder Sie haben eine schlechte Idee, alle zusammen.
  • Ich weiß nicht, es ist für Lernzwecke oder nicht, aber dieses problem Spezifikation ist viel komplizierter, als es sein muss. Es ist einfach auf der Suche nach set 2 Attribute list und simulate. list kann eine Auswahl von 3 Dingen; simulate ist eine beliebige Zeichenfolge, trotz der Tatsache, dass es 4 mögliche flags.

InformationsquelleAutor Elia | 2013-02-02
Schreibe einen Kommentar