web-dev-qa-db-fra.com

Comment puis-je rompre cette longue ligne en Python?

Comment feriez-vous pour formater une longue ligne comme celle-ci? J'aimerais que le texte ne dépasse pas 80 caractères:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

Est-ce ma meilleure option?

url = "Skipping {0} because its thumbnail was already in our system as {1}."
logger.info(url.format(line[indexes['url']], video.title))
153
Gattster

C'est un début. Ce n'est pas une mauvaise pratique de définir vos chaînes plus longues en dehors du code qui les utilise. C'est un moyen de séparer les données et les comportements. Votre première option consiste à joindre implicitement les littéraux de chaîne en les rendant adjacents les uns aux autres:

("This is the first line of my text, "
"which will be joined to a second.")

Ou avec des suites de fin de ligne, ce qui est un peu plus fragile, car cela fonctionne:

"This is the first line of my text, " \
"which will be joined to a second."

Mais cela ne veut pas:

"This is the first line of my text, " \ 
"which will be joined to a second."

Regarde la différence? Non? Eh bien, vous ne le ferez pas non plus quand ce sera votre code.

L'inconvénient de la jointure implicite est qu'il ne fonctionne qu'avec les littéraux de chaîne, et non avec les chaînes issues de variables, de sorte que les choses peuvent devenir un peu plus poilues lorsque vous effectuez une refactorisation. En outre, vous ne pouvez interpoler le formatage que sur la chaîne combinée.

Sinon, vous pouvez vous joindre explicitement à l'aide de l'opérateur de concaténation (+):

("This is the first line of my text, " + 
"which will be joined to a second.")

Explicit vaut mieux qu'implicite, comme le dit le zen de python, mais cela crée trois chaînes au lieu d'une, et utilise deux fois plus de mémoire: il y a les deux que vous avez écrites, plus une qui est les deux réunis, il faut donc savoir quand ignorer le zen. L'aspect positif est que vous pouvez appliquer le formatage à n'importe quelle sous-chaîne séparément sur chaque ligne, ou au lot entier en dehors des parenthèses.

Enfin, vous pouvez utiliser des chaînes à triple citation:

"""This is the first line of my text
which will be joined to a second."""

C’est souvent mon préféré, bien que son comportement soit légèrement différent de celui de la nouvelle ligne et de tout espace situé au début des lignes suivantes. Vous pouvez éliminer la nouvelle ligne avec une barre oblique inverse.

"""This is the first line of my text \
which will be joined to a second."""

Cela pose le même problème que la même technique que celle décrite ci-dessus, en ce sens qu'un code correct ne diffère d'un code incorrect que par des espaces invisibles.

Le choix du "meilleur" dépend de votre situation particulière, mais la réponse n'est pas simplement esthétique, mais l'un des comportements les plus subtils.

295
jcdyer

Les littéraux de chaîne consécutifs sont joints par le compilateur et les expressions entre parenthèses sont considérées comme une seule ligne de code:

logger.info("Skipping {0} because it's thumbnail was "
  "already in our system as {1}.".format(line[indexes['url']],
  video.title))
37

Personnellement, je n'aime pas suspendre les blocs ouverts, alors je le formaterais comme suit:

logger.info(
    'Skipping {0} because its thumbnail was already in our system as {1}.'
    .format(line[indexes['url']], video.title)
)

En général, je n'aurais pas la peine de m'efforcer de placer le code exactement dans une ligne de 80 colonnes. Il est utile de réduire la longueur de ligne à des niveaux raisonnables, mais la limite stricte des 80 appartient au passé.

11
bobince

Vous pouvez utiliser le module textwrap pour le diviser en plusieurs lignes

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))

ABCDEFGH
IJKLIMNO

De la documentation :

textwrap. wrap (text [ width [ ...]])
Entoure le paragraphe simple de texte (une chaîne) de sorte que chaque ligne ait au plus une largeur de caractères. Retourne une liste de lignes en sortie, sans nouvelles lignes finales.

Les arguments de mot clé facultatifs correspondent aux attributs d'instance de TextWrapper , documentés ci-dessous. La largeur par défaut est 70.

Voir la méthode TextWrapper.wrap() pour plus de détails sur le comportement de wrap ().

3
Saurabh

Pour ceux qui essaient également d'appeler .format() sur une longue chaîne et qui sont incapables d'utiliser certaines des techniques d'habillage de chaîne les plus populaires sans interrompre l'appel ultérieur de .format(, vous pouvez utiliser str.format("", 1, 2). au lieu de "".format(1, 2). Cela vous permet de casser la corde avec la technique de votre choix. Par exemple:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

peut être

logger.info(str.format(("Skipping {0} because its thumbnail was already"
+ "in our system as {1}"), line[indexes['url']], video.title))

Sinon, la seule possibilité consiste à utiliser des continuations de fin de ligne, dont je ne suis personnellement pas un fan.

0
Simon Alford