142 votes

Chaînes f multilignes en Python

J'essaie d'écrire du code conforme à PEP-8 pour un projet domestique (je dois admettre que ce sont mes premiers pas dans le monde de python) et j'ai une chaîne f qui fait plus de 80 caractères de long

- la ligne solide et fine près du point à self.text est la marque de 80 caractères.

J'essaie de le diviser en plusieurs lignes dans la plupart des cas. pythonique mais la seule réponse qui fonctionne est une erreur pour mon linter.

Code de travail :

def __str__(self):
    return f'{self.date} - {self.time},\nTags:' + \
    f' {self.tags},\nText: {self.text}'

Sortie :

2017-08-30 - 17:58:08.307055,
Tags: test tag,
Text: test text

Le linter pense que je ne respecte pas l'E122 de PEP-8, y a-t-il un moyen d'obtenir la chaîne correcte et le code conforme ?

0 votes

Vous n'avez pas besoin de tout renvoyer sur une seule ligne, créez une chaîne de base dans une variable puis ajoutez chaque partie en utilisant += . Ensuite, il suffit de retourner la variable. La raison pour laquelle il n'est pas conforme à la norme E122 est peut-être parce que vous n'indentez pas la ligne suivante.

0 votes

Quelle est la description complète de l'E122 ?

1 votes

Ou dites simplement à votre idéal d'augmenter la limite de caractères de la ligne, ou ignorez complètement cette règle.

175voto

noddy Points 432

De Guide de style pour le code Python :

La meilleure façon d'envelopper les longues lignes est d'utiliser la fonction implicite de Python. implicite de Python à l'intérieur des parenthèses, des crochets et des accolades.

Dans ces conditions, la solution suivante résoudrait votre problème d'une manière conforme à la PEP-8.

return (
    f'{self.date} - {self.time}\n'
    f'Tags: {self.tags}\n'
    f'Text: {self.text}'
)

Les chaînes Python sont automatiquement concaténées lorsqu'elles ne sont pas séparées par une virgule, de sorte que vous n'avez pas besoin d'appeler explicitement join() .

0 votes

Est-ce que le \n causer des problèmes dans Windows ? Existe-t-il un moyen de le faire sans l'outil spécifique à Unix ? \n ?

1 votes

Aucun problème sous Windows. Le site \n est agnostique vis-à-vis des plates-formes, comme Python l'a toujours été. les nouvelles lignes universelles activé par défaut depuis la version 3.0.

0 votes

Oh oui, j'ai essayé ça et ça a marché. J'ai oublié de mettre à jour ici. Ce bon vieux Python :').

54voto

Joran Beasley Points 28451

Je pense que ce serait

return f'''{self.date} - {self.time},
Tags: {self.tags},
Text: {self.text}'''

0 votes

Maintenant que c'est fermé, je peux supprimer cette réponse si les gens pensent que je devrais ... mais ce n'est pas couvert par la réponse dupe :/\

9 votes

Mais ce genre de multiligne va à l'encontre de l'objectif des chaînes f et de l'indentation De plus, je n'ai pas l'impression que ce soit la bonne utilisation des chaînes entre guillemets triples, ça ressemble à un piratage

2 votes

Bien que cette réponse reproduise l'intention du PO, je pense que la réponse de @noddy est meilleure. Cette réponse ça arrive comme ça pour être correct parce que le PO voulait aussi du multi-ligne dans la sortie. Si vous voulez que la sortie ait une disposition différente de celle du code source, les guillemets triples ne sont pas la solution.

27voto

lmiguelvargasf Points 9693

Vous pouvez utiliser soit des guillemets simples triples, soit des guillemets doubles triples, mais mettez un f au début de la chaîne :

Citations triples et simples

return f'''{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}'''

Citations de Triple Double

return f"""{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}"""

Notez que vous n'avez pas besoin d'utiliser " \n "car vous utilisez une chaîne de caractères à plusieurs lignes.

1 votes

Bonne remarque concernant " \n "et voici autre référence qui explique également qu'elle n'est pas nécessaire pour les chaînes multilignes (dans la section "Chaînes multilignes avec triples guillemets").

16voto

Miraz Points 31

Comme mentionné par @noddy, l'approche fonctionne également pour l'expression d'affectation de variable :

var1 = "foo"
var2 = "bar"
concat_var = (f"First var is: {var1}"
              f" and in same line Second var is: {var2}")
print(concat_var)

devrait vous donner :

First var is: foo and in same line Second var is: bar

1voto

Timur Shtatland Points 7599

Vous pouvez mélanger les styles de citation multi-lignes et les chaînes de caractères normales et les chaînes de caractères f :

foo = 'bar'
baz = 'bletch'
print(f'foo is {foo}!\n',
      'bar is bar!\n',
      f"baz is {baz}!\n",
      '''bletch
      is
      bletch!''')

Imprimez ceci (notez l'indentation) :

foo is bar!
 bar is bar!
 baz is bletch!
 bletch
      is
      bletch!

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