¿Cómo puedo usar una nueva línea '\n' en una cadena f para formatear la salida?

Resuelto malmed asked hace 7 años • 8 respuestas

Probé este código:

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)

Sin embargo, '\'no se puede utilizar dentro de las {...}partes de expresión de una cadena f. ¿Cómo puedo hacerlo funcionar? El resultado debería ser:

Winners are:
Adam
Bob
Cyril

Consulte ¿Por qué no es posible utilizar barras invertidas dentro de las llaves de las cadenas f? ¿Cómo puedo solucionar el problema? para una discusión adicional sobre por qué existe la limitación.

malmed avatar Jun 27 '17 19:06 malmed
Aceptado

Pitón 3.12+

Puede utilizar barras invertidas dentro de cadenas f y el código existente de la pregunta funciona como se esperaba. Consulte https://docs.python.org/3.12/whatsnew/3.12.html#pep-701-syntactic-formalization-of-f-strings .

Pitón <3.12

No puedes. Las barras invertidas no pueden aparecer dentro de las llaves {}; hacerlo da como resultado un SyntaxError:

>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash

Esto se especifica en el PEP para cadenas f:

Es posible que las barras invertidas no aparezcan dentro de las partes de expresión de las cadenas f, [...]

Una opción es asignar '\n'un nombre y luego .joineso dentro de la fcadena; es decir, sin utilizar un literal:

names = ['Adam', 'Bob', 'Cyril']
nl = '\n'
text = f"Winners are:{nl}{nl.join(names)}"
print(text)

Resultados en:

Winners are:
Adam
Bob
Cyril

Otra opción, según lo especificado por @wim, es usar chr(10)para \nregresar y luego unirse allí.f"Winners are:\n{chr(10).join(names)}"

Otra opción más, por supuesto, es '\n'.joinagregar de antemano el nombre en consecuencia:

n = "\n".join(names)
text = f"Winners are:\n{n}"

lo que da como resultado el mismo resultado.

Nota:

Esta es una de las pequeñas diferencias entre f-strings y str.format. En este último, siempre puedes usar puntuación siempre que se descomprima el correspondiente dictado extravagante que contiene esas claves:

>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"

(Por favor, no hagas esto).

En el primero, la puntuación no está permitida porque no se pueden tener identificadores que la utilicen.


Aparte: definitivamente optaría por printo format, como sugieren las otras respuestas como alternativa. Las opciones que he dado solo se aplican si por alguna razón debes usar cadenas f.

Sólo porque algo sea nuevo no significa que debas intentar hacer todo con ello ;-)

No necesita cadenas f u otros formateadores para imprimir una lista de cadenas con un separador. Simplemente use el separgumento de palabra clave para print():

names = ['Adam', 'Bob', 'Cyril']
print('Winners are:', *names, sep='\n')

Producción:

Winners are:
Adam
Bob
Cyril

Dicho esto, usar str.join()/str.format() aquí podría decirse que sería más simple y más legible que cualquier solución alternativa de cadena f:

print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))
Eugene Yarmash avatar Jun 27 '2017 12:06 Eugene Yarmash