Comment écrire une chaîne de caractères très longue qui est conforme à PEP8 et prévient E501

comme PEP8 suggère de rester en dessous de la règle de 80 colonnes pour votre programme python, Comment puis-je m'y tenir avec de longues chaînes, i.e.

s = "this is my really, really, really, really, really, really, really long string that I'd like to shorten."

comment étendre ceci à la ligne suivante, i.e.

s = "this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten."
132
demandé sur Braiam 2009-12-09 18:20:54

8 réponses

la concaténation implicite pourrait être la solution la plus propre:

s = "this is my really, really, really, really, really, really," \
    " really long string that I'd like to shorten."

Edit à la réflexion, je conviens que la suggestion de Todd d'utiliser des crochets plutôt que la continuation de ligne est préférable pour toutes les raisons qu'il donne. La seule hésitation que j'ai, c'est qu'il est relativement facile de confondre les cordes entre crochets avec les tuples.

83
répondu Michael Dunn 2016-10-21 11:13:14

aussi, parce que les constantes de chaîne voisines sont automatiquement concaténées, vous pouvez le coder comme ceci aussi:

s = ("this is my really, really, really, really, really, really, "  
     "really long string that I'd like to shorten.")

Notez le signe no plus, et j'ai ajouté la virgule et l'espace supplémentaires qui suivent le formatage de votre exemple.

personnellement, je n'aime pas les tirets arrière, et je me souviens avoir lu quelque part que son utilisation est en fait dépréciée en faveur de cette forme qui est plus explicite. Rappelez-vous "Explicite est mieux qu'implicites."

je considère que le backslash est moins clair et moins utile car il échappe en fait au caractère newline. Il n'est pas possible de mettre un commentaire de fin de ligne après celui-ci si un devrait être nécessaire. Il est possible de le faire avec des constantes de chaîne concaténées:

s = ("this is my really, really, really, really, really, really, " # comments ok
     "really long string that I'd like to shorten.")

j'ai utilisé une recherche Google de "longueur de ligne python" qui renvoie le lien PEP8 comme premier résultat, mais aussi des liens vers un autre bon empattement post sur ce sujet: " Pourquoi Python PEP-8 spécifier une longueur de câble maximale de 79 caractères? "

une autre bonne phrase de recherche serait"Python line continuation".

204
répondu Todd 2017-05-23 12:34:33

je pense que le mot le plus important dans votre question était"suggère".

les normes de codage sont drôles. Souvent, les indications qu'ils fournissent ont une très bonne base lorsqu'elles ont été écrites (par exemple, la plupart des terminaux n'étant pas en mesure d'Afficher plus de 80 caractères sur une ligne), mais au fil du temps, ils deviennent fonctionnellement obsolètes, tout en restant strictement respectés. Je suppose que ce que vous devez faire ici est de peser les mérites de "casser" cette suggestion particulière contre le lisibilité et maintenabilité de votre code.

désolé cela ne répond pas directement à votre question.

12
répondu ZombieSheep 2009-12-09 15:24:55

vous avez perdu un espace, et vous avez probablement besoin d'un caractère de continuation de ligne, i.e. un \ .

s = "this is my really, really, really, really, really, really" +  \
    " really long string that I'd like to shorten."

ou même:

s = "this is my really, really, really, really, really, really"  \
    " really long string that I'd like to shorten."

Parens fonctionnerait aussi au lieu de la continuation de la ligne, mais vous risquez que quelqu'un pense que vous aviez l'intention d'avoir un tuple et vient d'oublier une virgule. Prenez par exemple:

s = ("this is my really, really, really, really, really, really"
    " really long string that I'd like to shorten.")

et:

s = ("this is my really, really, really, really, really, really",
    " really long string that I'd like to shorten.")

avec le typage dynamique de Python, le code peut fonctionner dans les deux sens, mais produire des résultats incorrects avec celui que vous n'aviez pas prévu.

12
répondu retracile 2009-12-09 15:30:29

barre Oblique inverse:

s = "this is my really, really, really, really, really, really" +  \
    "really long string that I'd like to shorten."

ou enveloppez-les dans des parenthèses:

s = ("this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten.")
4
répondu recursive 2009-12-09 15:24:01

avec un \ vous pouvez étendre les déclarations à plusieurs lignes:

s = "this is my really, really, really, really, really, really" + \
"really long string that I'd like to shorten."

devrait marcher.

1
répondu Ikke 2016-10-20 20:38:34

j'ai tendance à utiliser quelques méthodes non mentionnées ici pour spécifier de grandes chaînes, mais celles-ci sont pour des scénarios très spécifiques. YMMV...

  • blobs de texte multi-lignes, souvent avec des jetons formatés (pas tout à fait ce que vous demandiez, mais encore utile):

    error_message = '''
    I generally like to see how my helpful, sometimes multi-line error
    messages will look against the left border.
    '''.strip()
    
  • faites pousser la variable pièce par pièce à travers n'importe quelle méthode d'interpolation de chaîne que vous préférez:

    var = 'This is the start of a very,'
    var = f'{var} very long string which could'
    var = f'{var} contain a ridiculous number'
    var = f'{var} of words.'
    
  • lisez-le dans un fichier. PEP-8 ne limite pas la longueur des chaînes dans un fichier; juste les lignes de votre code. :)

  • utilisez la force brute ou votre éditeur pour diviser la chaîne en lignes de managaeble en utilisant newlines, puis supprimer toutes les newlines. (Semblable à la première technique que j'ai énumérée):

    foo = '''
    agreatbigstringthatyoudonotwanttohaveanyne
    wlinesinbutforsomereasonyouneedtospecifyit
    verbatimintheactualcodejustlikethis
    '''.replace('\n', '')
    
0
répondu Larold 2018-06-27 02:45:25

j'ai utilisé textwrap.dedent dans le passé. C'est un peu encombrant donc je préfère les continuations de ligne maintenant mais si vous voulez vraiment l'indentation de bloc, je pense que c'est génial.

exemple de Code (où la garniture est de se débarrasser du premier '\n' avec une tranche):

import textwrap as tw
x = """
       This is a yet another test.
       This is only a test"""
print(tw.dedent(x[1:]))

explication:

de ce que je peux dire, dedent calcule l'indentation basée sur l'espace blanc dans la première ligne de texte avant une nouvelle ligne. J'Ai Donc ajout d'une nouvelle ligne pour faciliter l'alignement du code. Pour éviter la nouvelle ligne, vous devez ajouter à la première ligne de texte un espace blanc supplémentaire afin que les lignes suivantes aient leur indentation réduite comme vous le souhaitez. Si vous souhaitez le modifier, vous pouvez facilement le réimplémenter en utilisant le module re .

cette méthode a des limites en ce que les lignes très longues sont encore plus longues que vous voulez, auquel cas d'autres méthodes qui concaténent les chaînes sont plus appropriées.

0
répondu MrMas 2018-08-22 22:57:55