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?
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.
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',...)