2010-06-19 5 views
9

J'essaye d'écrire une longue chaîne en Python qui s'affiche comme l'élément d'aide d'une option OptParser. Dans mon fichier .py de code source, je voudrais placer des retours à la ligne afin que mon code ne passe pas de nouvelles lignes. Cependant, je ne veux pas que ces nouvelles lignes affectent comment cette chaîne est affichée quand le code est exécuté. Par exemple, je veux écrire:Citer des chaînes longues sans newlines 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 façon de faire les choses ci-dessus, il sera quand j'appelle mon programme avec --help, l'explication de ma-option aura de nombreuses lacunes en elle.

Comment puis-je résoudre ce problème?

merci.

Répondre

18

Vous pouvez concaténer des chaînes littérales comme en C, donc "foo" "bar" est le même que "foobar", ce qui signifie cela devrait faire ce que vous voulez:

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

Notez que vous n'a pas besoin de caractères de continuation de barre oblique inversée car le tout est entre parenthèses.

+1

Vous avez toujours besoin des signes \ à la fin des lignes. –

+9

@Emil H: Non, car il est inclus dans '()' dans le cadre des paramètres. –

+1

Je suis corrigé. –

1

Cela fonctionne:

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

print foo 
+0

je peux faire cela, mais cela semble verbeux ... y a-t-il un raccourci standard pour cela? Je veux essentiellement du sucre syntaxique qui fait que les chaînes de traitement de python traitent TeX, où les espaces de nouvelle ligne n'ont pas d'importance. – user248237dfsf

9

Il suffit de prendre avantage de la chaîne littérale juxtaposition - en Python, comme en C, si deux chaînes littérales sont à côté de l'autre avec seulement les espaces blancs entre (y compris les nouvelles lignes), le compilateur les fusionner en un chaîne unique littérale, en ignorant les espaces. I.e. .:

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

Je suppose que par « je veux » vous dire réellement « Je ne veux pas » ici ;-).

Notez les espaces de fin à la fin de chaque morceau du littéral vous passez comme help: vous devez les y mettre explicitement, ou bien la juxtaposition ferait « mots » tels que doesmany et ainsi de suite ;-) .

Notez que, de façon très différente de ce que quelques réponses et commentaires prétendent, vous avez très certainement ne besoin laid, points positifs redondants et-ou anti-slash ici - pas de points positifs nécessaires parce que le compilateur applique juxtaposition pour vous, pas antislashs nécessaire soit parce que cet ensemble de lignes physiques est une seule ligne logique (grâce au paren ouvert n'étant pas encore fermé jusqu'à la fin de l'ensemble des lignes physiques!).

4

formatter aide par défaut reformate la chaîne de sorte que vous pouvez utiliser des sauts de ligne dans la chaîne de l'aide que vous le souhaitez:

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

Pour supprimer un espace de premier plan commun, vous pouvez utiliser 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. 
Questions connexes