213 votes

Comment puis-je briser cette longue ligne en Python?

Comment vous y prendriez-vous sur la mise en forme d'une longue ligne comme ceci? Je voudrais arriver à pas plus de 80 caractères de large:

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

Est-ce que 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))

395voto

jcdyer Points 7956

C'est un début. Ce n'est pas une mauvaise pratique de définir vos chaînes plus longues à l'extérieur du code qui les utilise. C'est une façon de séparer les données et le comportement. Votre première option est de rejoindre les littéraux de chaîne ensemble implicitement en les rendant adjacents l'un à l'autre:

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

Ou avec la ligne de fin de prolongements, 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 ce n'est pas:

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

Vous voyez la différence? Non? Eh bien, vous n'aurez pas quand c'est à votre code.

L'inconvénient de l'implicite rejoindre, c'est qu'il ne fonctionne qu'avec des littéraux de chaîne, pas avec des chaînes de prises de variables, de sorte que les choses peuvent devenir un peu plus poilu lorsque vous refactoriser. Aussi, vous ne pouvez interpoler mise en forme sur l'ensemble de la chaîne dans son ensemble.

Alternativement, vous pouvez rejoindre explicitement en utilisant l'opérateur de concaténation (+):

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

Explicite est mieux que implicites, comme le zen de python dit, mais cela crée trois cordes au lieu d'une, et utilise deux fois plus de mémoire: il y a les deux que vous avez écrit, plus un qui est les deux réunis, de sorte que vous devez connaître lorsque ignorer le zen. L'avantage est que vous pouvez appliquer la mise en forme un des sous-chaînes séparément sur chaque ligne, ou à l'ensemble du lot de l'extérieur des parenthèses.

Enfin, vous pouvez utiliser le triple-chaînes entre guillemets:

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

C'est souvent une de mes préférées, même si son comportement est légèrement différent que le saut de ligne et préfixes d'espaces sur les lignes suivantes apparaîtront dans votre chaîne finale. Vous pouvez supprimer le saut de ligne avec une barre oblique inverse d'échappement.

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

Cela a le même problème que la même technique que ci-dessus, que le code est correct seulement diffère de code incorrect par d'invisibles espaces.

Lequel est le "mieux" dépend de votre situation particulière, mais la réponse n'est pas simplement esthétique, mais l'un d'subtilement différents comportements.

53voto

Consécutives des littéraux de chaîne sont rejoints 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))

13voto

bobince Points 270740

Personnellement je n'aime pas la pendaison de blocs ouverts, alors je serais en forme comme:

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 ne voudrais pas ennuyer lutte trop dur de faire le code de l'adapter exactement à l'intérieur d'une colonne 80 ligne. Il est bon de garder la longueur de la ligne vers le bas à des niveaux raisonnables, mais la dur de 80 limite est une chose du passé.

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