J'aimerais savoir comment formater ce boîtier de manière pythonique avec des f-strings:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
Le problème est qu'il '\'
ne peut pas être utilisé dans les {...}
parties d'expression d'une chaîne f. Production attendue:
Winners are:
Adam
Bob
Cyril
python
python-3.x
newline
python-3.6
f-string
malmené
la source
la source
f"Winners are:\n{chr(10).join(names)}"
Réponses:
Vous ne pouvez pas. Les barres obliques inverses ne peuvent pas apparaître à l'intérieur des accolades
{}
; cela se traduit parSyntaxError
:Ceci est spécifié dans le PEP pour les chaînes f:
Une option consiste à attribuer
'\n'
un nom, puis.join
à celui-ci dans laf
chaîne -string; c'est-à-dire sans utiliser de littéral:Résulte en:
Une autre option, telle que spécifiée par @wim, consiste à utiliser
chr(10)
pour être\n
renvoyé, puis à y rejoindre.f"Winners are:\n{chr(10).join(names)}"
Encore une autre, bien sûr, consiste à
'\n'.join
ajouter au préalable le nom en conséquence:ce qui donne le même résultat.
Remarque:
C'est l'une des petites différences entre
f
-strings etstr.format
. Dans ce dernier, vous pouvez toujours utiliser la ponctuation à condition qu'un dict loufoque correspondant soit décompressé qui contient ces clés:(Veuillez ne pas faire ça.)
Dans le premier cas, la ponctuation n'est pas autorisée car vous ne pouvez pas avoir d'identificateurs qui les utilisent.
À part: j'opterais certainement pour
print
ouformat
, comme le suggèrent les autres réponses comme alternative. Les options que j'ai données ne s'appliquent que si vous devez pour une raison quelconque utiliser des chaînes f.Ce n'est pas parce que quelque chose est nouveau que vous devriez essayer de tout faire avec ;-)
la source
Vous n'avez pas besoin de chaînes f ou d'autres formateurs pour imprimer une liste de chaînes avec un séparateur. Utilisez simplement l'
sep
argument mot - clé pourprint()
:Production:
Cela dit, utiliser
str.join()
/str.format()
here serait sans doute plus simple et plus lisible que toute solution de contournement de chaîne f:la source
print(*dir(some_object), sep='\n')
ouprint(*vars(some_object), sep='\n')
.str.join()
:text = '\n'.join(['Winners are:', *names])
. BTW,print()
peut être utilisé pour écrire dans n'importe quel fichier (spécifié avec l'file
argument,sys.stdout
par défaut).Vous ne pouvez pas utiliser de barres obliques inverses dans les chaînes f comme d'autres l'ont dit, mais vous pouvez contourner cela en utilisant
os.linesep
(bien que notez que cela ne sera pas\n
sur toutes les plates-formes et n'est pas recommandé à moins de lire / écrire des fichiers binaires; voir les commentaires de Rick ):Ou peut-être d'une manière moins lisible, mais garantie d'être
\n
, avecchr()
:la source
os.linesep
n'est pas une bonne idée lors de la rédaction de texte.os.linesep
est juste pour la lecture, ou la lecture et l'écriture en mode binaire . Je sais que cela fonctionnera de la même manière dans ce cas, mais c'est une mauvaise habitude de commencer. Mais encore une fois: je n'étais pas le contre. La mise en garde me suffit. :)Les autres réponses donnent des idées sur la façon de mettre le caractère de nouvelle ligne dans un champ de chaîne f. Cependant, je dirais que pour l'exemple donné par l'OP (qui peut ou non être indicatif du cas d'utilisation réel de l'OP), aucune de ces idées ne devrait réellement être utilisée.
L'intérêt de l'utilisation de chaînes f est d'augmenter la lisibilité du code. Il n'y a rien que vous puissiez faire avec des chaînes f que vous ne pouvez pas faire
format
. Examinez attentivement s'il y a quelque chose de plus lisible à ce sujet (si vous pouviez le faire):...ou ca:
...ou ca:
vs ceci:
Le dernier moyen est au moins aussi lisible, sinon plus.
En bref: n'utilisez pas de marteau lorsque vous avez besoin d'un tournevis simplement parce que vous en avez un neuf brillant. Le code est lu beaucoup plus souvent qu'il n'est écrit.
Pour d'autres cas d'utilisation, oui, il est possible que l'
chr(10)
idée ou l'newline
idée soit appropriée. Mais pas pour celui donné.la source