Estoy usando argparse
Python 2.7 para analizar las opciones de entrada. Una de mis opciones es una opción múltiple. Quiero hacer una lista en su texto de ayuda, p. Ej.
from argparse import ArgumentParser
parser = ArgumentParser(description='test')
parser.add_argument('-g', choices=['a', 'b', 'g', 'd', 'e'], default='a',
help="Some option, where\n"
" a = alpha\n"
" b = beta\n"
" g = gamma\n"
" d = delta\n"
" e = epsilon")
parser.parse_args()
Sin embargo, argparse
elimina todas las líneas nuevas y espacios consecutivos. El resultado se ve como
~ / Descargas: 52 $ python2.7 x.py -h uso: x.py [-h] [-g {a, b, g, d, e}] prueba argumentos opcionales: -h, - ayuda a mostrar este mensaje de ayuda y salir -g {a, b, g, d, e} Alguna opción, donde a = alpha b = beta g = gamma d = delta e = épsilon
¿Cómo insertar nuevas líneas en el texto de ayuda?
argparse
, no por el intérprete, por lo que cambiar a"""..."""
no ayudará.Respuestas:
Intenta usar
RawTextHelpFormatter
:fuente
Only the name of this class is considered a public API. All the methods provided by the class are considered an implementation detail.
probablemente no sea una gran idea, aunque podría no importar, ya que 2.7 está destinado a ser la última python 2.x y se espera que refactorice muchas cosas para 3.x de todos modos. Realmente estoy ejecutando 2.6 conargparse
instalado vía,easy_install
por lo que la documentación puede estar desactualizada.RawDescriptionHelpFormatter
que solo funciona en la descripción y el epílogo en lugar del texto de ayuda.RawTextHelpFormatter
nuevas líneas iniciales y finales se eliminan. Para evitar esto, simplemente puede agregar dos o más líneas nuevas consecutivas; todas menos una nueva línea sobrevivirán.class Formatter( argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter): pass
y luegoformatter_class=Formatter
.Si solo desea anular la única opción, no debe usarla
RawTextHelpFormatter
. En su lugar, subclaseHelpFormatter
y proporcione una introducción especial para las opciones que deben manejarse "en bruto" (uso"R|rest of help"
):Y úsalo:
Cualquier otra llamada a
.add_argument()
donde no comience la ayudaR|
se finalizará normalmente.Esto es parte de mis mejoras en argparse . El SmartFormatter completo también admite agregar los valores predeterminados a todas las opciones y la entrada sin formato de la descripción de las utilidades. La versión completa tiene su propio
_split_lines
método, por lo que se conserva cualquier formato realizado, por ejemplo, a cadenas de versión:fuente
parser.add_argument('-v', '--version', action='version',version=get_version_str())
¿Es posible extenderlo a ese caso?_split_lines
y conserva los saltos de línea (no es necesario especificar "R |" al principio, si desea esa opción, parchee el_VersionAction.__call__
método_VersionAction.__call__
que probablemente querría que lo haga enparser.exit(message=version)
lugar de usar la versión formateada. ¿Hay alguna forma de hacerlo sin lanzar una copia parcheada de argparse?__call__
en_VersionAction
haciendoargparse._VersionAction.__call__ = smart_version
después de definirdef smart_version(self, parser, namespace, values, option_string=None): ...
Otra forma fácil de hacerlo es incluir textwrap .
Por ejemplo,
De esta manera, podemos evitar el largo espacio vacío frente a cada línea de salida.
fuente
Me he enfrentado a un problema similar (Python 2.7.6). Intenté dividir la sección de descripción en varias líneas usando
RawTextHelpFormatter
:Y consiguió:
Entonces
RawTextHelpFormatter
no es una solución. Debido a que imprime la descripción tal como aparece en el código fuente, preservando todos los caracteres de espacio en blanco (quiero mantener pestañas adicionales en mi código fuente para facilitar la lectura, pero no quiero imprimirlas todas. Además, el formateador sin formato no ajusta la línea cuando está demasiado largo, más de 80 caracteres, por ejemplo).Gracias a @Anton que inspiró la dirección correcta arriba . Pero esa solución necesita una ligera modificación para formatear la sección de descripción .
De todos modos, se necesita formateador personalizado. Extendí la
HelpFormatter
clase existente y el_fill_text
método anulado como este:Compare con el código fuente original que proviene del módulo argparse :
En el código original se está envolviendo la descripción completa. En el formateador personalizado arriba, todo el texto se divide en varios fragmentos, y cada uno de ellos se formatea de forma independiente.
Entonces, con la ayuda del formateador personalizado:
la salida es:
fuente
HelpFormatter
es problemática ya que los desarrolladores de argparse solo garantizan que el nombre de la clase sobrevivirá en futuras versiones de argparse. Básicamente, se han escrito un cheque en blanco para que puedan cambiar los nombres de los métodos si les resulta conveniente hacerlo. Esto me parece frustrante; Lo menos que podrían haber hecho es exponer algunos métodos en la API.Quería tener saltos de línea manuales en el texto de la descripción y ajuste automático del mismo; pero ninguna de las sugerencias aquí funcionó para mí, así que terminé modificando la clase SmartFormatter dada en las respuestas aquí; A pesar de los problemas con los nombres de métodos argparse que no son una API pública, esto es lo que tengo (como un archivo llamado
test.py
):Así es como funciona en 2.7 y 3.4:
fuente
A partir de SmartFomatter descrito anteriormente, terminé con esa solución:
Tenga en cuenta que extrañamente el argumento formatter_class pasado al analizador de nivel superior no es heredado por sub_parsers, uno debe pasarlo nuevamente por cada sub_parser creado.
fuente
Prefacio
Para esta pregunta,
argparse.RawTextHelpFormatter
es útil para mí.Ahora, quiero compartir cómo uso el
argparse
.Sé que puede no estar relacionado con la pregunta,
pero estas preguntas me han molestado por un tiempo.
Así que quiero compartir mi experiencia, espero que sea útil para alguien.
Aquí vamos.
Módulos de terceros
colorama : para cambiar el color del texto:
pip install colorama
Ejemplo
Donde la clase de
FormatText
es la siguientefuente