Питон: наиболее идиоматические способ, чтобы преобразовать не на пустую строку?


Каков наиболее идиоматичный способ сделать следующее?

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 112

15 ответов:

Если вы действительно хотите, чтобы ваша функция вела себя как встроенная str(), но возвращала пустую строку, когда аргумент отсутствует, сделайте следующее:

def xstr(s):
    if s is None:
        return ''
    return str(s)
def xstr(s):
    return '' if s is None else 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 является ложным. Подробное объяснение см. В разделебулевы операторы . Это коротко, но не очень ясно.

return s or '' будет работать просто отлично для вашей заявленной проблемы!

def xstr(s):
   return s or ""

Функциональный путь (однострочный)

xstr = lambda s: '' if s is None else s
def xstr(s):
    return {None:''}.get(s, s)

Вариация на тему выше, если вам нужно быть совместимым с 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 '')
def xstr(s):
    return s if s else ''

s = "%s%s" % (xstr(a), xstr(b))

Мы всегда можем избежать приведения типов в сценариях, описанных ниже.

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)

Используйте оценку короткого замыкания:

s = a or '' + b or ''

Так как + не очень хорошо работает со строками, лучше использовать формат строк:

s = "%s%s" % (a or '', b or '')