2012-11-20 8 views
9

Ich habe Code, der wie folgt aussieht: siehtWie kann ich Python Argparse nur einmal auswählen?

list_of_choices = ["foo", "bar", "baz"] 
parser = argparse.ArgumentParser(description='some description') 
parser.add_argument("-n","--name","-o","--othername",dest=name, 
    choices=list_of_choices 

und was ich für eine Ausgabe wie:

-n {foo,bar,baz}, --name {foo,bar,baz}, -o {foo,bar,baz}, 
--othername {foo,bar,baz} 

Was würde Ich mag ist:

-n, --name, -o, --othername {foo,bar,baz} 

Für Kontext gibt es Historische Gründe, warum wir zwei Namen für die gleiche Option brauchen und die tatsächliche Liste der Auswahlmöglichkeiten ist 22 Elemente lang, so sieht es viel schlechter aus als die oben genannten.

Dieses Problem ist subtil anders als Python argparse: Lots of choices results in ugly help output in dem ich nicht mit zwei separaten Optionen arbeiten und es ist okay, alles auf der Linie wie oben zu haben.

Antwort

8

Ich denke, Sie könnten mehrere add_arguments() wollen und nur die Auswahl auf die eine, die Sie wollen die Auswahl.

list_of_choices = ["foo", "bar", "baz"] 
parser = argparse.ArgumentParser(description='some description') 
parser.add_argument("-n") 
parser.add_argument("--name") 
parser.add_argument("-o") 
parser.add_argument("--othername",dest='name', 
    choices=list_of_choices) 
+0

Ich glaube nicht, dass das ganz funktioniert, wenn ich -f foo übergebe, erhalte ich später einen Fehler, der besagt, dass name keiner ist. – coyot

+0

Versuchen Sie, alle Argumente zu erfassen oder nur diejenigen zu akzeptieren, die Sie definieren? In diesem Fall müssten Sie ein weiteres add_argument() für -f ausführen. Ich denke auch, dass dest eine Zeichenkette dest = 'name' sein soll. http://docs.python.org/dev/library/argparse.html#dest –

3

Danke, @ thomas-schultz. Ich war mir des sequentiellen Aspekts von add_argument nicht bewusst und Ihr Kommentar brachte mich auf den richtigen Weg, kombiniert mit einem Kommentar von diesem anderen Thread.

Grundsätzlich, was ich jetzt tun, ist alle vier in eine Mutex-Gruppe setzen, unterdrücken Sie die Ausgabe der ersten drei und fügen Sie sie dann in der Beschreibung der Gruppe.

Die Ausgabe sieht so aus:

group1 
    use one of -n, --name, -o, --othername 
-n {foo,bar,baz} 

, die viel sauberer als das Original.

+7

Können Sie den Code posten, den Sie haben, damit ich bekomme, was Sie tun? :) –

0

Hier ist der Code, den ich nach etwas mehr Zwicken ließ sich auf, zu groß für einen Kommentar :(

parser = argparse.ArgumentParser(description='some description', 
    epilog="At least one of -n, -o, --name, or --othername is required and they all do the same thing.") 
parser.add_argument('-d', '--dummy', dest='dummy', 
    default=None, help='some other flag') 
stuff=parser.add_mutually_exclusive_group(required=True) 
stuff.add_argument('-n', dest='name', 
    action='store', choices=all_grids, help=argparse.SUPPRESS) 
stuff.add_argument('-o', dest='name', 
    action='store', choices=all_grids, help=argparse.SUPPRESS) 
stuff.add_argument('--name', dest='name', 
    action='store', choices=all_grids, help=argparse.SUPPRESS) 
stuff.add_argument('--othername', dest='name', 
    action='store', choices=all_grids, help='') 
args = parser.parse_args() 

Ausgabe wie folgt aussieht:

(Nutzung, dann Optionen Liste dann :)

--othername {foo, bar, baz}

mindestens ein -n, -o --name oder --othername erforderlich ist und sie alle das gleiche tun.

+0

Warum bearbeiten Sie das nicht in Ihre andere Antwort? Es ist immerhin Teil derselben Antwort. – Michael

Verwandte Themen