условная строка в строке формата (f «{…}»)

Как вы знаете в 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 ответа


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}"

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

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

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

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


Есть идеи?

10000