He enfrentado un problema similar (Python 2.7.6). He tratado de romper Descripción sección en varias líneas utilizando RawTextHelpFormatter
:
parser = ArgumentParser(description="""First paragraph
Second paragraph
Third paragraph""",
usage='%(prog)s [OPTIONS]',
formatter_class=RawTextHelpFormatter)
options = parser.parse_args()
Y tengo:
usage: play-with-argparse.py [OPTIONS]
First paragraph
Second paragraph
Third paragraph
optional arguments:
-h, --help show this help message and exit
Así RawTextHelpFormatter
no es una solución. Porque imprime la descripción tal como aparece en el código fuente, preservando todos los espacios en blanco (quiero mantener pestañas adicionales en mi código fuente para poder leerlas, pero no quiero imprimirlas todas. También el formateador sin procesar 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 above. Pero esa solución necesita una ligera modificación para formatear la sección descripción.
De todos modos, se necesita un formateador personalizado. Extendí HelpFormatter
clase existente y hizo caso omiso de _fill_text
método como este:
import textwrap as _textwrap
class MultilineFormatter(argparse.HelpFormatter):
def _fill_text(self, text, width, indent):
text = self._whitespace_matcher.sub(' ', text).strip()
paragraphs = text.split('|n ')
multiline_text = ''
for paragraph in paragraphs:
formatted_paragraph = _textwrap.fill(paragraph, width, initial_indent=indent, subsequent_indent=indent) + '\n\n'
multiline_text = multiline_text + formatted_paragraph
return multiline_text
Comparar con el código fuente original procedente de argparse módulo:
def _fill_text(self, text, width, indent):
text = self._whitespace_matcher.sub(' ', text).strip()
return _textwrap.fill(text, width, initial_indent=indent,
subsequent_indent=indent)
En el código original toda la descripción se está envuelto.En el formateador personalizado anterior, el texto completo se divide en varios fragmentos y cada uno de ellos se formatea de forma independiente.
Así que con la ayuda de formateador personalizado:
parser = ArgumentParser(description= """First paragraph
|n
Second paragraph
|n
Third paragraph""",
usage='%(prog)s [OPTIONS]',
formatter_class=MultilineFormatter)
options = parser.parse_args()
la salida es:
usage: play-with-argparse.py [OPTIONS]
First paragraph
Second paragraph
Third paragraph
optional arguments:
-h, --help show this help message and exit
No tengo Python 2.7 conmigo para poder probar mis ideas. ¿Qué hay de usar el texto de ayuda entre comillas triples ("" "" ""). ¿Las nuevas líneas sobreviven usando esto? – pyfunc
@pyfunc: No. El stripping se realiza en tiempo de ejecución mediante 'argparse', no el intérprete, por lo que cambiar a' "" "..." "" 'no ayudará. – kennytm