19 votes

Comment faire en sorte que Python Argparse ne liste les choix qu'une seule fois ?

J'ai un code qui ressemble à ceci :

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

et ce que j'obtiens en sortie ressemble à ceci :

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

Ce que je voudrais, c'est.. :

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

Pour le contexte, il y a des raisons historiques pour lesquelles nous avons besoin de deux noms pour la même option et la liste de choix actuelle est longue de 22 éléments, de sorte que la situation est bien pire que celle décrite ci-dessus.

Ce problème est subtilement différent de celui de la Python argparse : Un grand nombre de choix entraîne une sortie d'aide moche en ce sens que je ne travaille pas avec deux options distinctes et qu'il n'y a pas d'inconvénient à ce que tout soit sur la même ligne, comme ci-dessus.

20voto

Michael Lihs Points 123

Je pense que vous voudrez peut-être plusieurs add_arguments() et ne mettre que choices sur celui où vous voulez faire des choix.

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)

4voto

coyot Points 368

Merci, @thomas-schultz. Je n'étais pas conscient de l'aspect séquentiel de add_argument et votre commentaire m'a mis sur la bonne voie, combiné avec un commentaire de l'autre fil de discussion.

En fait, ce que je fais maintenant, c'est que je place les quatre dans un groupe mutex, que je supprime la sortie des trois premiers et que je les inclus dans la description du groupe.

La sortie se présente comme suit :

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

qui est BEAUCOUP plus propre que l'original.

2voto

coyot Points 368

Voici le code que j'ai choisi après quelques ajustements :

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()

sortie avec -h est l'utilisation, puis la liste des options, puis ceci :

--othername {foo,bar,baz}

At least one of -n, -o, --name, or --othername is required and they all do the same thing.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X