Personnaliser le message d'aide argparse

j'ai écrit le code suivant pour illustrer mon problème.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--version', action='version',
                    version='%(prog)s 1.0')
parser.parse_args()

ceci produit le message d'aide suivant.

$ python foo.py --help
usage: foo.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --version  show program's version number and exit

je veux personnaliser cette sortie d'aide de sorte qu'elle capitalise toutes les phrases et les phrases, et met période après les phrases. En d'autres termes, je veux que le message d'aide soit généré comme ceci.

$ python foo.py --help
Usage: foo.py [-h] [-v]

Optional arguments:
  -h, --help     Show this help message and exit.
  -v, --version  Show program's version number and exit.

est ce quelque chose que je peux contrôler en utilisant l'API argparse. Si oui, comment? Pourriez-vous veuillez donner un petit exemple qui montre comment cela peut être fait?

21
demandé sur Lone Learner 2016-03-07 18:06:57

2 réponses

tout d'abord: capitaliser ces phrases vole en face de la convention, et argparse n'est pas vraiment outillé pour vous aider à changer ces chaînes facilement. Vous avez trois classes différentes de chaînes ici: texte boilerplate de l'aide formatter, titres de section, et texte d'aide par option spécifique. Toutes ces chaînes sont localisables; vous pourrait juste fournir une traduction' capitalisée 'pour toutes ces chaînes via le module gettext() soutenez . Cela dit, Vous pouvez atteindre et remplacer toutes ces chaînes si vous êtes suffisamment déterminé et lire le code source un peu .

l'action version inclut un texte par défaut help , mais vous pouvez fournir le vôtre en paramétrant l'argument help . La même chose s'applique à l'action help ; si vous définissez add_help argument à False vous pouvez ajouter cette action manuellement:

parser = argparse.ArgumentParser(add_help=False)

parser.add_argument('-v', '--version', action='version',
                    version='%(prog)s 1.0', help="Show program's version number and exit.")
parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
                    help='Show this help message and exit.')

ensuite, le message optional arguments est un group title ; chaque analyseur a deux groupes par défaut, l'un pour les arguments de position, l'autre pour optionnel. Vous pouvez les atteindre par les attributs _positionals et _optionals , qui ont tous deux un attribut title :

parser._positionals.title = 'Positional arguments'
parser._optionals.title = 'Optional arguments'

soyez averti , en accédant aux noms commençant par un underscore vous vous aventurez dans le API privée non documentée du module, et votre code peut se casser dans de futures mises à jour.

enfin, pour changer la chaîne de caractères usage , vous devrez sous-classe le formateurd'aide; passer la sous-classe en tant que formatter_class argument :

class CapitalisedHelpFormatter(argparse.HelpFormatter):
    def add_usage(self, usage, actions, groups, prefix=None):
        if prefix is None:
            prefix = 'Usage: '
        return super(CapitalisedHelpFormatter, self).add_usage(
            usage, actions, groups, prefix)

parser = argparse.ArgumentParser(formatter_class=CapitalisedHelpFormatter)

de Démonstration, la mise de ces tous ensemble:

>>> import argparse
>>> class CapitalisedHelpFormatter(argparse.HelpFormatter):
...     def add_usage(self, usage, actions, groups, prefix=None):
...         if prefix is None:
...             prefix = 'Usage: '
...         return super(CapitalisedHelpFormatter, self).add_usage(
...             usage, actions, groups, prefix)
...
>>> parser = argparse.ArgumentParser(add_help=False, formatter_class=CapitalisedHelpFormatter)
>>> parser._positionals.title = 'Positional arguments'
>>> parser._optionals.title = 'Optional arguments'
>>> parser.add_argument('-v', '--version', action='version',
...                     version='%(prog)s 1.0', help="Show program's version number and exit.")
_VersionAction(option_strings=['-v', '--version'], dest='version', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help="Show program's version number and exit.", metavar=None)
>>> parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
...                     help='Show this help message and exit.')
_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='Show this help message and exit.', metavar=None)
>>> print(parser.format_help())
Usage: [-v] [-h]

Optional arguments:
  -v, --version  Show program's version number and exit.
  -h, --help     Show this help message and exit.
21
répondu Martijn Pieters 2016-03-07 16:28:08

Martijn a donné un couple des correctifs qui sont venus à l'esprit - la fourniture du paramètre help , et une classe de Formatteur personnalisé.

une autre correction partielle consiste à modifier la chaîne d'aide après la création de l'argument. add_argument crée et renvoie un objet Action qui contient les paramètres et les valeurs par défaut. Vous pouvez sauvegarder un lien vers ce fichier et modifier le Action . Vous pouvez également obtenir une liste de ces actions et agir en conséquence.

permettez-moi d'illustrer, pour un analyseur simple avec l'aide par défaut et un autre argument, la liste d'action est:

In [1064]: parser._actions
Out[1064]: 
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
 _StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)]

je peux visualiser et modifier l'attribut help de l'un de ceux-ci:

In [1065]: parser._actions[0].help
Out[1065]: 'show this help message and exit'
In [1066]: parser._actions[0].help='Show this help message and exit.'

produire cette aide:

In [1067]: parser.parse_args(['-h'])
usage: ipython3 [-h] [-f FOO]    
optional arguments:
  -h, --help         Show this help message and exit.
  -f FOO, --foo FOO

utilisant la liste parser._actions utilise un attribut "privé", que certaines personnes considèrent imprudent. Mais en Python que la distinction public / privé n'est pas serrée, et peut être rompu avec soin. Martijn le fait en accédant au parser._positionals.title .

une autre façon de changer ce titre de groupe est avec custom argument groups

ogroup=parser.add_argument_group('Correct Optionals Title')
ogroup.add_argument('-v',...)
ogroup.add_argument('-h',...)
3
répondu hpaulj 2016-03-07 17:04:41