Me gustaría poder usar las opciones globales de un objeto argparse.ArgumentParser para anular/aumentar los valores predeterminados para un comando secundario.argparse aumenta los valores predeterminados del sub-comando a través de las opciones globales
Un ejemplo sería que la ayuda que se muestra refleja los cambios globales, es decir, para el siguiente ejemplo de juguete:
import argparse
import os
import sys
# Global parser and options.
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--user",
dest="user",
default=os.environ.get("USER"),
help="Override the setting of the $USER variable.")
# Sub-command parser and options.
subparsers = parser.add_subparsers()
command = subparsers.add_parser(
"command",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
command.add_argument("--config",
dest="config",
default="~%s/config" % os.environ.get("USER"),
help="The config file.")
options = parser.parse_args()
Lo ideal sería que cuando al ejecutar esto en modo de ayuda me gustaría conseguir,
> python example.py --user thing command --help
usage: example.py command [-h] [--config CONFIG]
optional arguments:
-h, --help show this help message and exit
--config CONFIG The config file. (default: ~thing/config)
es decir, la ruta del archivo de configuración es específica del usuario (cosa). Me doy cuenta de que podría cambiar la configuración predeterminada para que sea "~%(user)s/config"
y luego resolver esto en tiempo de ejecución con el espacio de nombres de las opciones; sin embargo, me gustaría que la ayuda sea más explícita.
que se reúnen una solución alternativa sería la de tratar de analizar los argumentos de una vez para obtener las opciones globales, es decir,
if "--help" in sys.argv:
# Parse the command minus the help to obtain the global options.
args = sys.argv[1:]
args.remove("--help")
# Update the defaults with the global options.
options = parser.parse_args(args)
command.set_defaults(config="~%s/config" % options.user)
# Re-parse the options.
parser.parse_args()
Aunque esto parece un poco hacky. ¿Hay un mejor enfoque/solución?
Gracias por la respuesta. Este enfoque es definitivamente mucho más limpio/simple que mi enfoque y más similar a un enfoque que estaba intentando sin argparse, es decir, analizar los argumentos dos veces. Puedo buscar en el código para ver cómo puedo obtener parse_known_args() para regresar con opciones (en lugar de salir) cuando se proporciona el argumento "--ayuda" en lugar de eliminarlo según mi ejemplo. – John
Oh, me olvidé de eso. Puede capturar la excepción 'SystemExit' que' parse_known_args() 'lanzará cuando llame a 'ArgumentParser.exit' (que es un contenedor relativamente delgado alrededor de' sys.exit'). – chepner
Oye, sí, lo he intentado, sin embargo, el problema con el try/except es que las opciones no están definidas. – John