Me gustaría saber cómo formatear este caso de manera Pythonic con f-strings:
names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
El problema es que '\'
no se puede usar dentro de las {...}
porciones de expresión de una cadena f. Rendimiento esperado:
Winners are:
Adam
Bob
Cyril
python
python-3.x
newline
python-3.6
f-string
malmed
fuente
fuente
f"Winners are:\n{chr(10).join(names)}"
Respuestas:
No puedes. Las barras invertidas no pueden aparecer dentro de las llaves
{}
; hacerlo da como resultadoSyntaxError
:Esto se especifica en el PEP para f-strings:
Una opción es asignar
'\n'
un nombre y luego.join
en el interior def
-string; es decir, sin usar un literal:Resultados en:
Otra opción, según lo especificado por @wim, es usar
chr(10)
para ser\n
devuelto y luego unirse allí.f"Winners are:\n{chr(10).join(names)}"
Otro, por supuesto, es de
'\n'.join
antemano y luego agregar el nombre en consecuencia:lo que da como resultado la misma salida.
Nota:
Esta es una de las pequeñas diferencias entre
f
-strings ystr.format
. En este último, siempre puede usar la puntuación siempre que se descomprima un dictado loco correspondiente que contenga esas claves:(Por favor, no hagas esto).
En el primero, la puntuación no está permitida porque no puede tener identificadores que los usen.
Aparte: definitivamente optaría por
print
oformat
, como sugieren las otras respuestas, como alternativa. Las opciones que he dado solo se aplican si, por alguna razón, debe usar cadenas de f.El hecho de que algo sea nuevo no significa que debas intentar hacer todo con él ;-)
fuente
No necesita f-strings u otros formateadores para imprimir una lista de cadenas con un separador. Simplemente use el
sep
argumento de palabra clave paraprint()
:Salida:
Dicho esto, podría decirse que usar
str.join()
/str.format()
aquí sería más simple y más legible que cualquier solución alternativa de f-string:fuente
print(*dir(some_object), sep='\n')
oprint(*vars(some_object), sep='\n')
.str.join()
:text = '\n'.join(['Winners are:', *names])
. Por cierto,print()
se puede usar para escribir en cualquier archivo (especificado con elfile
argumento,sys.stdout
por defecto).No puede usar barras invertidas en f-strings como han dicho otros, pero podría evitar esto usando
os.linesep
(aunque tenga en cuenta que esto no estará\n
en todas las plataformas y no se recomienda a menos que lea / escriba archivos binarios; vea los comentarios de Rick ):O quizás de una manera menos legible, pero garantizada
\n
, conchr()
:fuente
os.linesep
es una buena idea al escribir texto.os.linesep
es solo para leer, o leer y escribir en modo binario . Sé que funcionará igual en este caso, pero es un mal hábito comenzar. Pero de nuevo: yo no fui el voto negativo. La advertencia es suficiente para mí. :)Las otras respuestas dan ideas sobre cómo poner el carácter de nueva línea en un campo de cadena f. Sin embargo, yo diría que para el ejemplo que dio el OP (que puede o no ser indicativo del caso de uso real del OP), ninguna de estas ideas debería usarse realmente.
El objetivo de usar f-strings es aumentar la legibilidad del código. No hay nada que puedas hacer con f-strings que no puedas hacer
format
. Considere cuidadosamente si hay algo más legible sobre esto (si pudiera hacerlo):...o esto:
...o esto:
vs. esto:
La última forma es al menos igual de legible, si no más.
En resumen: no use un martillo cuando necesite un destornillador solo porque tiene uno nuevo y brillante. El código se lee con mucha más frecuencia de lo que se escribe.
Para otros casos de uso, sí, es posible que la
chr(10)
idea o lanewline
idea sea apropiada. Pero no por el dado.fuente