Питон: наиболее идиоматические способ, чтобы преобразовать не на пустую строку?
Каков наиболее идиоматичный способ сделать следующее?
def xstr(s):
if s is None:
return ''
else:
return s
s = xstr(a) + xstr(b)
Update: я включаю предложение триптиха использовать str (s), что делает эту рутинную работу для других типов, кроме строк. Я ужасно впечатлен лямбда-предложением Винея Саджипа, но я хочу сохранить свой код относительно простым.
def xstr(s):
if s is None:
return ''
else:
return str(s)
15 ответов:
Если вы действительно хотите, чтобы ваша функция вела себя как встроенная
str()
, но возвращала пустую строку, когда аргумент отсутствует, сделайте следующее:def xstr(s): if s is None: return '' return str(s)
Если вы знаете, что значение всегда будет либо строкой, либо нет:
xstr = lambda s: s or "" print xstr("a") + xstr("b") # -> 'ab' print xstr("a") + xstr(None) # -> 'a' print xstr(None) + xstr("b") # -> 'b' print xstr(None) + xstr(None) # -> ''
Вероятно, самым коротким будет
str(s or '')
Потому что ни один не является ложным, и "x или y" возвращает y, если x является ложным. Подробное объяснение см. В разделебулевы операторы . Это коротко, но не очень ясно.
Вариация на тему выше, если вам нужно быть совместимым с Python 2.4
xstr = lambda s: s is not None and s or ''
Я использую функцию max:
max(None, '') #Returns blank max("Hello",'') #Returns Hello
Работает как шарм ;) просто поместите свою строку в первый параметр функции.
Аккуратный однострочный, чтобы сделать это здание на некоторых других ответах:
s = (lambda v: v or '')(a) + (lambda v: v or '')(b)
Или даже просто:
s = (a or '') + (b or '')
Мы всегда можем избежать приведения типов в сценариях, описанных ниже.
customer = "John" name = str(customer) if name is None print "Name is blank" else: print "Customer name : " + name
В приведенном выше примере, если переменная customer's value не имеет значения, она далее получает кастинг при присвоении 'name'. Сравнение в предложении " if " всегда будет неудачным.
customer = "John" # even though its None still it will work properly. name = customer if name is None print "Name is blank" else: print "Customer name : " + str(name)
Приведенный выше пример будет работать должным образом. Такие сценарии очень распространены, когда значения извлекаются из URL, JSON или XML или даже значения нуждаются в дальнейшем приведении типов для любых манипуляций.
Если речь идет только о форматировании строк, вы можете сделать следующее:
from string import Formatter class NoneAsEmptyFormatter(Formatter): def get_value(self, key, args, kwargs): v = super().get_value(key, args, kwargs) return '' if v is None else v fmt = NoneAsEmptyFormatter() s = fmt.format('{}{}', a, b)