Как использовать новую строку '\n' в f-string для форматирования вывода в Python 3.6?

Я хотел бы знать, как отформатировать этот случай на Pythonic с помощью f-строк:

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

Проблема в том, что '\' нельзя использовать внутри частей выражения {...} f-строки. Ожидаемый результат:

Winners are:
Adam
Bob
Cyril

Ответы

Ответ 1

Вы не можете. Обратные косые черты не могут появляться внутри фигурных скобок {}; это приводит к SyntaxError:

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

Это указано в PEP для f-строк:

Обратные косые черты могут не отображаться внутри частей выражения f-строк, [...]

Один параметр указывает '\n' на имя, а затем .join на то, что внутри f -string; то есть без использования литерала:

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

Результаты в:

Winners are:
Adam
Bob
Cyril

Другой вариант, указанный в @wim, заключается в использовании chr(10) для возврата \n, а затем присоединения к нему. f"Winners are:\n{chr(10).join(names)}"

Еще один, конечно, должен '\n'.join заранее, а затем добавить имя соответственно:

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

что приводит к тому же результату.

Примечание:

Это одно из небольших различий между f -строками и str.format. В последнем случае вы всегда можете использовать пунктуацию, при условии, что соответствующий wacky dict распакован, содержащий эти ключи:

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

(Пожалуйста, не делайте этого.)

В первом случае пунктуация не допускается, потому что вы не можете использовать идентификаторы, которые их используют.


Кроме того: я бы выбрал print или format, поскольку другие ответы предлагают в качестве альтернативы. Параметры, которые я дал, применимы только в том случае, если по какой-то причине вы должны использовать f-строки.

Просто потому, что что-то новое, не означает, что вы должны попробовать и сделать все с ним; -)

Ответ 2

Вам не нужны f-строки или другие средства форматирования, чтобы напечатать список строк с разделителем. Просто передайте аргумент ключевого слова sep в print():

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

Выход:

Winners are:
Adam
Bob
Cyril

Тем не менее, использование str.format() здесь было бы, возможно, проще и более читабельным, чем любой обходной путь f-строки:

print("Winners are:\n{}".format("\n".join(names))

Ответ 3

Другие ответы дают идеи о том, как поместить символ новой строки в поле f-string. Тем не менее, я бы сказал, что для примера, который дал OP (который может или не может указывать на фактический вариант использования OP), ни одна из этих идей не должна использоваться.

Весь смысл использования f-строк - это повышение удобочитаемости кода. Вы ничего не можете сделать с f-строками, которые вы не можете сделать с помощью format. Внимательно изучите, есть ли что-нибудь более читаемое об этом (если вы это сделаете):

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

... или это:

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

... или это:

"Winners are:\n{chr(10).join(names)}"

против. это:

"Winners are:\n{}".format('\n'.join(names))

Последний способ, по крайней мере, является читабельным, если не более.

Короче: не используйте молоток, когда вам нужна отвертка только потому, что у вас есть блестящий новый. Код читается гораздо чаще, чем написано.

В других случаях использования да, возможно, идея chr(10) идея или newline может быть уместной. Но не для одного.

Ответ 4

Вы не можете использовать обратную косую черту в f-строках, как говорили другие, но вы можете обойти это, используя os.linesep (хотя обратите внимание, что это не будет \n на всех платформах и не рекомендуется, если вы не читаете/не записываете двоичные файлы, см. комментарии Рика):

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

Или, возможно, менее читаемым способом, но гарантированно \n, с chr():

>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril