Me gustaría saber cómo formatear este caso de forma 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 Cyrilno puedes Las barras invertidas no pueden aparecer dentro de las llaves {} ; hacerlo da como resultado un error de SyntaxError :
>>> f'{\}' SyntaxError: f-string expression part cannot include a backslashEsto se especifica en el PEP para f-strings:
Las barras invertidas pueden no aparecer dentro de las porciones de expresión de f-strings, [...]
Una opción es asignar '\n' a un nombre y luego .join a eso dentro de la cadena f ; es decir, sin usar 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 obtener \n devuelto y luego unirse allí. f"Winners are:\n{chr(10).join(names)}"
Otro, por supuesto, es '\n'.join antemano y luego agregar el nombre en consecuencia:
n = "\n".join(names) text = f"Winners are:\n{n}"lo que da como resultado la misma salida.
Esta es una de las pequeñas diferencias entre f -strings y str.format . En este último, siempre puede usar la puntuación siempre que se haya desempaquetado un dictado loco correspondiente que contenga esas claves:
>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'}) "Hello World!"(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 o format , como sugieren las otras respuestas como alternativa. Las opciones que he dado solo se aplican si, por alguna razón, debe usar f-strings.
El hecho de que algo sea nuevo no significa que debas intentar hacer todo con él ;-)
No necesita f-strings u otros formateadores para imprimir una lista de cadenas con un separador. Simplemente use el argumento de la palabra clave sep 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 f-string:
print('\n'.join(['Winners are:', *names])) print('Winners are:\n{}'.format('\n'.join(names)))No puede usar barras invertidas en f-strings como han dicho otros, pero puede evitar esto usando os.linesep (aunque tenga en cuenta que esto no será \n en todas las plataformas, y no se recomienda a menos que lea/escriba archivos binarios; ver los comentarios de Rick ):
>>> import os >>> names = ['Adam', 'Bob', 'Cyril'] >>> print(f"Winners are:\n{os.linesep.join(names)}") Winners are: Adam Bob Cyril O quizás de una manera menos legible, pero con garantía de ser \n , con chr() :
>>> print(f"Winners are:\n{chr(10).join(names)}") Winners are: Adam Bob Cyril