Argparse: façon d'inclure les valeurs par défaut dans '--help'?

supposons que j'ai l'extrait d'argparse suivant:

diags.cmdln_parser.add_argument( '--scan-time',
                     action  = 'store',
                     nargs   = '?',
                     type    = int,
                     default = 5,
                     help    = "Wait SCAN-TIME seconds between status checks.")

actuellement, --help retourne:

usage: connection_check.py [-h]
                             [--version] [--scan-time [SCAN_TIME]]

          Test the reliability/uptime of a connection.



optional arguments:
-h, --help            show this help message and exit
--version             show program's version number and exit
--scan-time [SCAN_TIME]
                    Wait SCAN-TIME seconds between status checks.

je préférerais quelque chose comme:

--scan-time [SCAN_TIME]
                    Wait SCAN-TIME seconds between status checks.
                    (Default = 5)

regarder le code de formatteur d'aide a révélé des options limitées. Est-ce qu'il y a une façon intelligente d'obtenir argparse pour imprimer la valeur par défaut pour --scan-time d'une manière similaire, ou devrais-je simplement sous-classe le formatage help ?

200
demandé sur akshat 2012-08-28 04:25:11

4 réponses

utiliser le argparse.ArgumentDefaultsHelpFormatter formater :

parser = argparse.ArgumentParser(
    # ... other options ...
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)

pour citer la documentation:

l'autre classe de formatteur disponible, ArgumentDefaultsHelpFormatter , ajoutera des informations sur la valeur par défaut de chacun des arguments.

notez que ceci ne s'applique qu'aux arguments dont le texte d'aide définit ; sans valeur help pour un argument, il est à noter d'ajouter les informations à .

la sortie exacte de votre option scan-time devient alors:

  --scan-time [SCAN_TIME]
                        Wait SCAN-TIME seconds between status checks.
                        (default: 5)
300
répondu Martijn Pieters 2018-10-04 07:26:00

ajouter '%(default)' au paramètre d'aide pour contrôler ce qui est affiché.

parser.add_argument("--type", default="toto", choices=["toto","titi"],
                              help = "type (default: %(default)s)")
140
répondu polux.moon 2014-06-03 02:01:02

ArgumentDefaultsHelpFormatter + RawTextHelpFormatter héritage multiple

l'héritage Multiple fonctionne, tout simplement, bien qu'il ne semble pas être une API publique:

#!/usr/bin/env python3
import argparse
import sys
class RawTextArgumentDefaultsHelpFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.RawTextHelpFormatter): pass
parser = argparse.ArgumentParser(formatter_class=RawTextArgumentDefaultsHelpFormatter)
parser.add_argument('-a', default=13, help="""my help
for a""")
parser.add_argument('-b', default=42, help="""my help
for b""")
parser.print_help()

sortie:

usage: a.py [-h] [-a A] [-b B]

optional arguments:
  -h, --help  show this help message and exit
  -a A        my help
              for a (default: 13)
  -b B        my help
              for b (default: 42)

il fonctionne tout simplement parce que comme nous pouvons le voir trivialement à partir des sources https://github.com/python/cpython/blob/v3.6.5/Lib/argparse.py#L648 that:

  • RawTextHelpFormatter instruments _split_lines
  • ArgumentDefaultsHelpFormatter instruments _get_help_string

donc nous pouvons deviner qu'ils vont travailler ensemble très bien.

Toutefois, cela ne semble pas être une API publique, et ne sont ni les méthodes de la formatter_class , donc je ne pense pas qu'il y est une API publique manière de le faire actuellement. argparse docstring dit:

toutes les autres classes ce module est considéré comme détails de mise en œuvre. (Notez également que HelpFormatter et RawDescriptionHelpFormatter ne sont considéré public en tant que noms d'objets -- L'API des objets formatter est toujours considéré comme un détail d'implémentation.)

Voir aussi: personnaliser le message d'aide argparse

testé sur Python 3.6.5.

2

il n'y a pas de default pour le Optparser en python.

Cependant, vous pouvez utiliser le suivant -

# show help as default
if len(sys.argv) == 1:
  os.system("python " + sys.argv[0] + " -h")
  exit()

cette commande exécutera le même script avec l'option -h , et exit .

S'il vous plaît noter - vous aurez besoin de import os, sys modules pour utiliser cette option.

-7
répondu Gilad Sharaby 2018-06-14 06:57:08