python3 - python argparse argumentparser()
Argparse: ¿Cómo incluir valores predeterminados en ''--help''? (4)
Supongamos que tengo el siguiente fragmento de código argparse:
diags.cmdln_parser.add_argument( ''--scan-time'',
action = ''store'',
nargs = ''?'',
type = int,
default = 5,
help = "Wait SCAN-TIME seconds between status checks.")
Actualmente, --help
devuelve:
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.
Preferiría algo como:
--scan-time [SCAN_TIME]
Wait SCAN-TIME seconds between status checks.
(Default = 5)
Mirando el código del formateador de ayuda reveló opciones limitadas. ¿Hay alguna forma inteligente de hacer que argparse
imprima el valor predeterminado para --scan-time
de una manera similar, o debería simplemente subclasificar el formateador de help
?
Agregue ''%(default)''
al parámetro de ayuda para controlar lo que se muestra.
parser.add_argument("--type", default="toto", choices=["toto","titi"],
help = "type (default: %(default)s)")
No hay default
para el Optparser
en python.
Sin embargo, puedes usar el siguiente
# show help as default
if len(sys.argv) == 1:
os.system("python " + sys.argv[0] + " -h")
exit()
Esto ejecutará el mismo script con la opción -h
, y saldrá.
Tenga en cuenta que tendrá que import os, sys
módulos de sistema import os, sys
para utilizar esta opción.
Utilice el formateador argparse.ArgumentDefaultsHelpFormatter
:
parser = argparse.ArgumentParser(
# ... other options ...
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
Para citar la documentación:
La otra clase de formateador disponible,
ArgumentDefaultsHelpFormatter
, agregará información sobre el valor predeterminado de cada uno de los argumentos.
Tenga en cuenta que esto solo se aplica a los argumentos que tienen texto de ayuda definido ; sin un valor de help
para un argumento, no hay que agregar información a .
La salida exacta para su opción de tiempo de escaneo se convierte entonces en:
--scan-time [SCAN_TIME]
Wait SCAN-TIME seconds between status checks.
(default: 5)
ArgumentDefaultsHelpFormatter
+ RawTextHelpFormatter
herencia múltiple
La herencia múltiple simplemente funciona, aunque no parece ser una API pública:
#!/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()
Salida:
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)
Simplemente funciona porque como podemos ver de forma trivial desde las fuentes https://github.com/python/cpython/blob/v3.6.5/Lib/argparse.py#L648 eso:
-
RawTextHelpFormatter
implementa_split_lines
-
ArgumentDefaultsHelpFormatter
implementa_get_help_string
así que podemos adivinar que trabajarán juntos muy bien.
Sin embargo, esto no parece ser una API pública, y tampoco lo son los métodos de formatter_class
, por lo que no creo que haya una forma pública de API para hacerlo actualmente. argparse
docstring dice:
Todas las demás clases en este módulo se consideran detalles de implementación. (También tenga en cuenta que HelpFormatter y RawDescriptionHelpFormatter solo se consideran públicos como nombres de objetos; la API de los objetos del formateador aún se considera un detalle de implementación).
Ver también: Personalizar mensaje de ayuda argparse.
Probado en Python 3.6.5.