2010-06-19 18 views
9

Sto provando a scrivere una lunga stringa in Python che viene visualizzata come elemento della guida di un'opzione OptParser. Nel mio codice sorgente .py file, mi piacerebbe posizionare le nuove righe in modo che il mio codice non spenda nuove righe. Tuttavia, non voglio che quelle nuove abbiano effetto sul modo in cui quella stringa viene visualizzata quando viene eseguito il codice. Per esempio, io voglio scrivere:Citando le stringhe lunghe senza newline in 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.''') 

il modo di fare le cose di cui sopra sarà più così quando chiamo il mio programma con --help, la spiegazione del mio-opzione avranno molte lacune in essa.

Come posso risolvere questo?

grazie.

risposta

18

è possibile concatenare stringhe letterali come in C, in modo da "foo" "bar" è lo stesso di "foobar", il che significa questo dovrebbe fare quello che vuoi:

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

Si noti che è non hanno bisogno di caratteri di continuazione della linea backslash perché l'intera cosa è tra parentesi.

+1

Hai ancora bisogno dei \ segni alla fine delle linee. –

+9

@Emil H: No, perché è racchiuso tra '()' come parte dei parametri. –

+1

Sono stato corretto. –

1

Questo funziona:

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

print foo 
+0

posso fare quello, ma sembra verboso ... c'è una mano breve standard per questo? Fondamentalmente voglio un po 'di zucchero sintattico che faccia sì che Python tratti le stringhe come fa TeX, dove lo spazio bianco non ha importanza. – user248237dfsf

9

Basta approfittare delle stringhe letterali giustapposizione - in Python, come in C, se due stringhe letterali sono uno accanto all'altro con un solo spazio bianco nel mezzo (compresi i ritorni a capo), il compilatore a loro si fondono in un letterale a stringa singola, ignorando gli spazi bianchi. Cioè .:

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

sto supponendo che con "Io voglio" in realtà vuol dire "Non voglio" qui ;-).

Nota gli spazi finali alla fine di ogni pezzo del letterale si sta passando come help: devi metterli lì in modo esplicito, altrimenti la giustapposizione renderebbe "parole", come doesmany e così via ;-) .

Si noti che, in modo molto diverso da quello che alcune risposte e commenti sostengono, è sicuramente non bisogno brutto, plus ridondanti e-o backslash qui - non plus necessari perché il compilatore applica giustapposizione per voi, senza barre rovesciate necessario perché questo insieme di linee fisiche è una singola linea logica (grazie al paren aperto non essendo ancora chiuso fino alla fine del set di linee fisiche!).

4

aiuto predefinito formattatore riformatta la stringa in modo da poter utilizzare a capo nella stringa di aiuto come ti piace:

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

di cancellare qualunque spazio iniziale comune è possibile utilizzare 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. 
Problemi correlati