условная строка в строке формата (f "{...}") - PullRequest
1 голос
/ 15 января 2020

Как вы знаете за Python 3.6, есть функция, известная как строковые литералы формата . str(obj['my_str_index']) может быть либо None, либо строковым значением. Я пробовал приведенный ниже, но он не дает 'null' текста, если он None.

foo = "soner test " \
f"{str(obj['my_str_index']) if str(obj['my_str_index']) is not None else 'null'}

Ответы [ 2 ]

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

str(None) не None, а "None". Так что без этой бесполезной и вредной строковой классификации:

foo = "soner test " \
f"{str(obj['my_str_index']) if obj['my_str_index'] is not None else 'null'}"

РЕДАКТИРОВАНИЕ: более разборчивый способ (обратите внимание, что интерполяция в f-строке автоматически приводит к строковому форматированию, поэтому нам вообще не нужно str):

index = obj['my_str_index']
if index is None:
    index = "none"
foo = f"soner test {index}"

РЕДАКТИРОВАТЬ: Другой способ, с моржом (ограничено до 3,8 +):

foo = f"soner test {'null' if (index := obj['my_str_index']) is None else index}"
1 голос
/ 15 января 2020

Вы можете значительно упростить условие. Это будет работать (в большинстве случаев см. Предостережение ниже) и, на мой взгляд, немного более читабельно

foo = f"soner test {obj['my_str_index'] or 'null'}"

Вам не нужно беспокоиться о str(...), потому что механизм интерполяции вызывает объекты __str__ метод неявно (если он не имеет __format__).

Единственное предостережение при таком подходе состоит в том, что foo будет содержать null, если obj['my_str_index'] равно любые значений Falsey (None, 0 и любая пустая последовательность).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...