usage metavar float example argumentparser argument python python-3.x argparse

metavar - argparse python example



Personalizar mensaje de ayuda argparse (2)

He escrito el siguiente código de muestra para demostrar mi problema.

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

Esto produce el siguiente mensaje de ayuda.

$ 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

Quiero personalizar esta salida de ayuda de modo que ponga mayúsculas en todas las frases y oraciones, y ponga un período después de las oraciones. En otras palabras, quiero que el mensaje de ayuda se genere de esta manera.

$ 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.

Es esto algo que puedo controlar usando la API argparse. ¿Si es así, cómo? ¿Podría darnos un pequeño ejemplo que muestre cómo se puede hacer esto?


Martijn ha dado un par de las correcciones que me vinieron a la mente: proporcionar el parámetro de help y una clase personalizada de Formatter.

Otra solución parcial es modificar la cadena de ayuda después de crear el argumento. add_argument crea y devuelve un objeto de Action que contiene los parámetros y valores predeterminados. Puede guardar un enlace a este, y modificar la Action . También puede obtener una lista de esas acciones y actuar en consecuencia.

Permítame ilustrar, para un analizador simple con la ayuda predeterminada y otro argumento, la lista de acciones es:

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)]

Puedo ver y modificar el atributo de help de cualquiera de estos:

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.''

produciendo esta ayuda:

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

El uso de la lista parser._actions utiliza un atributo ''privado'', que algunas personas consideran imprudente. Pero en Python, esa distinción entre lo público y lo privado no es estricta y se puede romper con cuidado. Martijn está haciendo eso accediendo al parser._positionals.title .

Otra forma de cambiar el título de ese grupo es con grupos de argumentos personalizados.

ogroup=parser.add_argument_group(''Correct Optionals Title'') ogroup.add_argument(''-v'',...) ogroup.add_argument(''-h'',...)


Primero que nada: argparse mayúscula esas frases va en contra de la convención, y argparse no está realmente diseñado para ayudarlo a cambiar estas cadenas fácilmente. Tiene tres clases diferentes de cadenas aquí: texto de plantilla del formateador de ayuda, títulos de sección y texto de ayuda por opción específica. Todas estas cadenas son localizables; simplemente puede proporcionar una traducción en mayúsculas para todas estas cadenas a través del soporte del módulo gettext() . Dicho esto, puede alcanzar y reemplazar todas estas cadenas si está suficientemente determinado y lea un poco el código fuente .

La acción de version incluye un texto de help predeterminado, pero puede proporcionar el suyo propio configurando el argumento de help . Lo mismo se aplica a la acción de help ; Si establece el argumento add_help en False , puede agregar esa acción manualmente:

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

A continuación, el mensaje de optional arguments es un título de grupo ; cada analizador tiene dos grupos predeterminados, uno para los argumentos posicionales y otro para los opcionales. Puede acceder a estos por los atributos _positionals y _optionals , los cuales tienen un atributo de title :

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

Tenga cuidado , al acceder a los nombres que comienzan con un guión bajo en el que se está aventurando en la API privada no documentada del módulo, y su código puede interrumpirse en futuras actualizaciones.

Finalmente, para cambiar la cadena de usage , tendrás que subclasificar el formateador de ayuda; pasar la subclase como el argumento formatter_class :

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)

Demo, poniendo estos todos juntos:

>>> 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.