Форматер f-строк, включая for-l oop или, если условия - PullRequest
0 голосов
/ 28 января 2020

Как я могу вставить for петли или if выражения внутри f-строки ?

Сначала я думал сделать что-то подобное для if выражений:

f'{a:{"s" if CONDITION else "??"}}'

Я хотел бы сделать что-то вроде:

Пример 1

f'{key: value\n for key, value in dict.items()}'

результат:

if dict = {'a': 1, 'b': 2}

a: 1 
b: 2

или Пример 2

c = 'hello'
f'{c} {name if name else "unknown"}'

результат:

если имя существует, например name = 'Mike'

hello Mike

в противном случае

hello unknown

Можно ли это сделать, и если да, то как?

1 Ответ

3 голосов
/ 29 января 2020

Внутри f-строк допускаются как троичные ("if выражения"), так и значения ("for выражения"). Однако они должны быть частью выражений, которые оцениваются как строки. Например, key: value - это пара dict, а f"{key}: {value}" требуется для создания строки.

>>> dct = {'a': 1, 'b': 2}
>>> newline = "\n"  # \escapes are not allowed inside f-strings
>>> print(f'{newline.join(f"{key}: {value}" for key, value in dct.items())}')
a: 1
b: 2

Обратите внимание, что если вся f-строка является выражением одного формата, проще просто оценивать выражение напрямую.

>>> print("\n".join(f"{key}: {value}" for key, value in dct.items())))
a: 1
b: 2

Выражения внутри строк формата по-прежнему следуют своей обычной семантике. Например, троичный может проверить, является ли существующее имя истинным. Сбой произойдет, если имя не определено.

>>> c, name = "Hello", ""
>>> f'{c} {name if name else "unknown"}'
'Hello unknown'
>>> del name
>>> f'{c} {name if name else "unknown"}'
NameError: name 'name' is not defined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...