2010-06-19 16 views
9

Estoy tratando de escribir una cadena larga en Python que se muestra como el elemento de ayuda de una opción OptParser. En mi archivo .py de código fuente, me gustaría colocar nuevas líneas para que mi código no gaste nuevas líneas. Sin embargo, no quiero que esas nuevas líneas afecten cómo se muestra esa cadena cuando se ejecuta el código. Por ejemplo, quiero escribir:Citando cadenas largas sin líneas nuevas en Python

parser.add_option("--my-option", dest="my_option", nargs=2, default=None, 
       help='''Here is a long description of my option. It does many things 
       but I want the shell to decide how to display this explanation. However, 
       I want newlines in this string.''') 

la forma anterior de hacer las cosas lo hará realidad cuando llamo a mi programa con --help, la explicación de mi-opción tiene muchas lagunas en ella.

¿Cómo puedo solucionar esto?

gracias.

Respuesta

18

puede concatenar cadenas literales al igual que en C, por lo "foo" "bar" es lo mismo que "foobar", significando esto debería hacer lo que quiera:

parser.add_option("--my-option", dest="my_option", nargs=2, default=None, 
      help="Here is a long description of my option. It does many things " 
      "but I want the shell to decide how to display this explanation. However, " 
      "I want newlines in this string.") 

Tenga en cuenta que no necesita caracteres de continuación de línea diagonal inversa porque todo está entre paréntesis.

+1

Aún necesita los signos \ al final de las líneas. –

+9

@Emil H: No, porque está encerrado en '()' como parte de los parámetros. –

+1

Me encuentro corregido. –

1

Esto funciona:

foo = "abc" + \ 
    "def" + \ 
    "ghi" 

print foo 
+0

que puedo hacer eso, pero parece detallado ... ¿hay una mano corta estándar para esto? Básicamente, quiero un poco de azúcar sintáctico que haga que python trate cadenas como TeX, donde el espacio en blanco de nueva línea no importa. – user248237dfsf

9

Simplemente tome ventaja de cadena literal yuxtaposición - en Python, como en C, si dos cadenas literales están uno junto al otro con sólo un espacio en blanco en el medio (incluyendo saltos de línea), el compilador fusionarlas en una cadena única literal, ignorando el espacio en blanco. Es decir .:

parser.add_option("--my-option", dest="my_option", nargs=2, default=None, 
        help='Here is a long description of my option. It does ' 
         'many things but I want the shell to decide how to ' 
         'display this explanation. However, I do NOT want ' 
         'newlines in this string.') 

Estoy asumiendo que por "yo quiero" en realidad se quiere decir "no quiero" aquí ;-).

Nota los espacios finales al final de cada pieza del literal estás pasando como help: usted tiene que poner allí de forma explícita, o bien la yuxtaposición harían "palabras" como doesmany y así sucesivamente ;-) . no hay ventajas necesarias porque el compilador aplica yuxtaposición para usted, no hay barras invertidas -

Tenga en cuenta que, muy diferente a lo que algunas respuestas y comentarios afirman, que definitivamente no necesita, ventajas redundantes y feas-o barras invertidas aquí

necesario, ya sea porque este conjunto de líneas físicas es una sola línea lógica (¡gracias a que la paren abierta no se cierra hasta el final del conjunto de líneas físicas!).

4

ayuda defecto formateador cambia el formato de la cadena de esta manera puede utilizar saltos de línea en la cadena de ayuda a su gusto:

>>> from optparse import OptionParser 
>>> parser = OptionParser() 
>>> parser.add_option('--my-option', help='''aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaa 
... b 
... c       d 
... e 
... f''') 
>>> parser.print_help() 
Usage: bpython [options] 

Options: 
    -h, --help   show this help message and exit 
    --my-option=MY_OPTION 
         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
         aaa b c       d e f 

para eliminar cualquier espacio inicial común que podría utilizar textwrap.dedent:

>>> from optparse import OptionParser 
>>> from textwrap import dedent 
>>> parser = OptionParser() 
>>> parser.add_option('--my-option', help=dedent('''\ 
...  Here is a long description of my option. It does many things 
...  but I want the shell to decide how to display this 
...  explanation. However, I want newlines in this string.''')) 
>>> parser.print_help() 
Usage: [options] 

Options: 
    -h, --help   show this help message and exit 
    --my-option=MY_OPTION 
         Here is a long description of my option. It does many 
         things but I want the shell to decide how to display 
         this explanation. However, I want newlines in this 
         string. 
Cuestiones relacionadas