Как вы знаете в 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
и любая пустая последовательность).