278 votes

Comment écrire une très longue chaîne qui est conforme à PEP8 et éviter l'erreur E501

PEP8 suggère une limite de ligne de 80 caractères. Mais ma chaîne dépasse cette limite :

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

Comment dois-je formater cela pour respecter la limite de caractères ? par exemple,

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

2 votes

S = "c'est mon "+"vraiment, "*6+"très longue phrase que je voudrais raccourcir." # Aïe ;-)

391voto

Todd Points 1978

Étant donné que les constantes de string voisines sont automatiquement concaténées, vous pouvez le coder de cette manière :

s = ("c'est ma chaîne très, très, très, très, très, très, "
     "très longue que je voudrais raccourcir.")

Remarquez l'absence de signe plus, et j'ai ajouté la virgule supplémentaire et l'espace qui suit la mise en forme de votre exemple.

Personnellement, je n'aime pas les barres obliques inverses, et je me souviens avoir lu quelque part que leur utilisation est en fait obsolète au profit de cette forme qui est plus explicite. Rappelez-vous que "Explicite vaut mieux qu'implicite".

Je considère que la barre oblique inverse est moins claire et moins utile parce qu'elle échappe en fait au caractère de retour à la ligne. Il n'est pas possible de mettre un commentaire de fin de ligne après cela si c'est nécessaire. Il est possible de le faire avec des constantes de chaîne concaténées :

s = ("c'est ma chaîne très, très, très, très, très, très, " # commentaires ok
     "très longue que je voudrais raccourcir.")

J'ai utilisé une recherche Google sur "longueur de ligne python" qui renvoie le lien PEP8 comme premier résultat, mais renvoie également à un autre bon post StackOverflow sur ce sujet : "Pourquoi Python PEP-8 spécifie une longueur de ligne maximale de 79 caractères ?"

Une autre bonne phrase de recherche serait "python continuation de ligne".

13 votes

+1: "Personnellement, je n'aime pas les barres obliques inverses, et je me souviens avoir lu quelque part que leur utilisation est en réalité déconseillée au profit de cette forme qui est plus explicite. Rappelle-toi que "Explicite vaut mieux qu'implicite"."

19 votes

Pour tous ceux qui reçoivent un tuple et se demandent pourquoi. Ne pas ajouter de virgules à la fin des lignes ici, cela résultera en un tuple, pas une chaîne de caractères. ;)

10 votes

N'est-il pas plus explicite d'ajouter le caractère + que dans l'exemple donné? Je considère toujours cela implicite. c.-à-d. "str1" + "str2" plutôt que "str1" "str2"

149voto

Michael Dunn Points 2919

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

Éditer En y réfléchissant, je suis d'accord avec la suggestion de Todd d'utiliser des crochets plutôt que la continuation de ligne pour toutes les raisons qu'il donne. La seule hésitation que j'ai est qu'il est relativement facile de confondre les chaînes entre crochets avec des tuples.

4 votes

C'est pourquoi je me suis senti comme un idiot en posant la question. Cheers.

9 votes

Ce texte est une continuation de ligne en échappant à la fin de ligne, ce n'est pas simplement une concaténation implicite, et jusqu'à très récemment expressément interdite dans PEP8, bien qu'il y ait maintenant une autorisation, mais PAS pour les longues chaînes. La réponse de Todd ci-dessous est correcte.

4 votes

J'aime PEP8, mais c'est une partie de PEP8 que je n'aime pas. Je trouve que la continuation implicite est plus claire, en raison de la possibilité de confusion avec les tuples.

19voto

ZombieSheep Points 18967

Je pense que le mot le plus important de votre question était "suggère".

Les normes de codage sont des choses amusantes. Souvent, les conseils qu'elles fournissent ont une très bonne base au moment de leur rédaction (par exemple, la plupart des terminaux ne pouvant pas afficher > 80 caractères sur une ligne), mais avec le temps, elles deviennent fonctionnellement obsolètes, mais sont toujours strictement respectées. Je suppose que ce que vous devez faire ici est de peser le pour et le contre de "briser" cette suggestion particulière par rapport à la lisibilité et à la maintenabilité de votre code.

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

0 votes

Je suis totalement d'accord. Il y a aussi une règle de style Java similaire qui est devenue obsolète (à mon avis).

0 votes

Oui, je suis d'accord, cependant cela me tracasse comment je pourrais y obéir dans cet exemple particulier. J'essaie toujours de garder les classes, les méthodes à moins de 80 caractères, cependant je dirais qu'une chaîne comme celle-ci n'a pas d'effet autre qu'éventuellement un effet négatif.

1 votes

Vous devez également prendre en compte vos préférences personnelles par rapport aux normes de codage communautaires. Vous voulez que les nouveaux arrivants puissent venir et se sentir à l'aise avec la mise en forme du code dès le premier jour.

16voto

retracile Points 6301

Vous avez perdu un espace, et vous avez probablement besoin d'un caractère de continuation de ligne, c'est-à-dire 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."

Les parenthèses fonctionneraient également à la place de la continuation de ligne, mais vous risquez que quelqu'un pense que vous avez l'intention d'avoir un tuple et que vous avez simplement oublié une virgule. Prenons par exemple:

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

comparé à:

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 s'exécuter des deux manières, mais produira des résultats incorrects avec celle que vous n'aviez pas prévue.

1voto

recursive Points 34729

Barre oblique inversée :

s = "c'est ma chaîne de caractères vraiment, vraiment, vraiment, vraiment, vraiment, vraiment" +  \
    "très longue que je voudrais raccourcir."

ou entre parenthèses :

s = ("c'est ma chaîne de caractères vraiment, vraiment, vraiment, vraiment, vraiment, vraiment" + 
    "très longue que je voudrais raccourcir.")

2 votes

Notez que le signe plus est nécessaire. Python concatène les chaînes de caractères littérales qui se suivent.

0 votes

Si vous utilisez des parenthèses, le signe plus n'est pas nécessaire. Si vous utilisez un signe plus, les parenthèses ne sont pas nécessaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X