Какой самый идиоматичный способ сделать следующее?
def xstr(s):
if s is None:
return ''
else:
return s
s = xstr(a) + xstr(b)
Обновление: я включил предложение Триптиха использовать str (s), что делает эту рутинную работу для других типов, кроме строк. Я очень впечатлен лямбда-предложением Vinay Sajip, но я хочу, чтобы мой код был относительно простым.
def xstr(s):
if s is None:
return ''
else:
return str(s)
s
была получена из поиска, где ключ не был найден, используйтеdict.get(key, '')
Ответы:
Если вы действительно хотите, чтобы ваша функция работала как
str()
встроенная, но возвращала пустую строку, когда аргумент None, сделайте это:источник
xstr = lambda s: '' if s is None else str(s)
if not s:
вместоif s is None
not False == True
ноFalse is None == False
.s
всегда a в типе str / unicode илиNone
. Да,False
это ценность, но я предпочитаю этот способ, который спасает мою клавиатуру и глаза;)источник
return s is not None and s or ''
... and .. or ..
терпит неудачу, и почему предпочтение отдается if-else. Есть две тонкие ошибки вs is not None and s or ''
.return '' if not s else str(s)
Вероятно, самый короткий будет
str(s or '')
Потому что None равно False, и «x or y» возвращает y, если x равно false. Посмотрите Булевы Операторы для подробного объяснения. Это коротко, но не очень явно.
источник
or
этого способаs
0, False или любое ложное значение''
iffs is None
. Все остальные входные данные должны возвращатьсяs
(илиstr(s)
в пересмотренном запросе).s
это такNone
, результатxstr()
должен быть пустой строкой, ноstr(None)
дает строку"None"
, которая является тем, что возвращается (поскольку строка"None"
не является ложным значением.Если вы знаете, что значение всегда будет либо строкой, либо None:
источник
[]
,{}
и т.д. дают тот же результат , какNone
, который не желательно.xstr(False)
, в частности, должно быть"False"
вместо""
. Злоупотребление лямбдами - плохой пример, используйте его,def xstr(s): return s or ""
если хотите, чтобы все было в одной строке.return s or ''
будет работать отлично для вашей заявленной проблемы!источник
s = False
илиs = 0
, скорее всего, это крайний случай в его использовании, и его можно легко смягчить, написав это какreturn str(s or '')
источник
''
к0
,[]
,{}
,False
и ложно-как ценности, которая является не то , что плакат просил.def xstr(s): return str(s) or ""
Функциональный способ (однострочник)
источник
Аккуратный однострочник, чтобы сделать это здание на некоторых из других ответов:
или даже просто:
источник
(lambda v: v or '')
?False
и пустой список также будет превращен в ''.0
и т. д.источник
get
.Я использую функцию Макс:
Работает как шарм;) Просто поместите вашу строку в первый параметр функции.
источник
Вариация выше, если вам нужно быть совместимым с Python 2.4
источник
Если речь идет о форматировании строк, вы можете сделать следующее:
источник
источник
Мы всегда можем избежать приведения типов в сценариях, описанных ниже.
В приведенном выше примере в случае, когда значение переменной customer равно None, оно далее получает приведение при присвоении имени. Сравнение в предложении if всегда будет неудачным.
Приведенный выше пример будет работать правильно. Такие сценарии очень распространены, когда значения выбираются из URL, JSON или XML, или даже значения требуют дальнейшего приведения типов для любых манипуляций.
источник
Используйте оценку короткого замыкания:
Поскольку + не очень хорошая операция со строками, лучше использовать строки формата:
источник
+
это очень хороший оператор для двух строк. Когда вы пытаетесь использовать его, чтобы присоединиться к десяткам, у вас возникают проблемы. Для двоих это, вероятно, будет быстрее, чем другие варианты; в любом случае, это в шуме.or
) кажется для меня излишним ... У меня нет случаев других ложных значений - либо str, либо None. За исключением комментария об+
операторе, который может зависеть от конкретного сценария и может потребовать бенчмаркинга, этот ответ не заслуживает -1Используйте строку F, если вы используете Python v3.7
источник
'None'
еслиs
естьNone
.