Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/05/2015, à 14:50

melixgaro

[Python] Message d'aide généré par argparse

Bonjour,

Je me suis aperçu d'un comportement étrange (= je ne m'y attendais pas ;-)) de argparse lorsqu'il affiche l'aide d'un programme.

Voilà le cas simple, qui marche :

#!/usr/bin/python3
# -*- coding: utf-8 -*-


import argparse

dummy = argparse.ArgumentParser(add_help=True)
grp = dummy.add_argument_group("Colors")
grp.add_argument("--white", action="store_true", default=True)
grp.add_argument("--black", action="store_true", default=True)
grp_excl = grp.add_mutually_exclusive_group()
grp_excl.add_argument("--red", action="store_true", default=True)
grp_excl.add_argument("--green", action="store_true", default=True)


dummy.parse_args()

Si je lance le programme avec l'option -h, j'obtiens

usage: pb_argparse.py [-h] [--white] [--black] [--red | --green]

optional arguments:
  -h, --help  show this help message and exit

Colors:
  --white
  --black
  --red
  --green

Donc on voit que les drapeaux sont bien réunies sous la catégories « Colors » : les deux drapeaux « normaux » (white et black) et les deux drapeaux mutuellement exclusifs (red et green).

Maintenant je veux que le programme accepte plusieurs sous-commandes (ex: « foreground » et « background ») qui ont des drapeaux en commun. Le programme devient


#!/usr/bin/python3
# -*- coding: utf-8 -*-


import argparse

dummy = argparse.ArgumentParser(add_help=False)
grp = dummy.add_argument_group("Colors")
grp.add_argument("--white", action="store_true", default=True)
grp.add_argument("--black", action="store_true", default=True)
grp_excl = grp.add_mutually_exclusive_group()
grp_excl.add_argument("--red", action="store_true", default=True)
grp_excl.add_argument("--green", action="store_true", default=True)


dummy2 = argparse.ArgumentParser()
subcommand = dummy2.add_subparsers()
subcommand.add_parser("foreground", parents=[dummy])

dummy2.parse_args()

Si j'affiche l'aide avec

./prog.py -h

j'ai bien

usage: prog.py [-h] {foreground} ...

positional arguments:
  {foreground}

optional arguments:
  -h, --help    show this help message and exit

Mais si je fais

./prog.py foreground -h

j'obtiens

usage: prog.py foreground [-h] [--white] [--black] [--red | --green]

optional arguments:
  -h, --help  show this help message and exit
  --red
  --green

Colors:
  --white
  --black

On voit que les drapeaux mutuellement exclusifs red et green ne sont plus dans le groupe « Colors » mais dans le groupe « optional arguments ».

Ma question : comment faire pour que les drapeaux red et green restent sous la catégorie « Colors » ? Ou avez-vous une meilleure suggestion pour gérer proprement ces histoires de drapeaux communs aux sous-commandes (sans avoir à écrire deux fois le quasi-même bloc d'instruction) ?

Merci d'avance


Linux depuis ~2007. Xubuntu seulement.

Hors ligne