Python: самый идиоматический способ преобразовать None в пустую строку?

что самое идиоматические способ сделать следующее?

def xstr(s):
    if s is None:
        return ''
    else:
        return s

s = xstr(a) + xstr(b)

обновление: Я включаю предложение Tryptich использовать str (s), что делает эту рутинную работу для других типов, кроме строк. Я ужасно впечатлен лямбда-предложением Винай Саджипа, но я хочу, чтобы мой код был относительно простым.

def xstr(s):
    if s is None:
        return ''
    else:
        return str(s)

15 ответов


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

def xstr(s):
    if s is None:
        return ''
    return str(s)

def xstr(s):
    return '' if s is None else str(s)

Если вы знаете, что значение всегда будет либо строкой, либо None:

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 '')

потому что нет False, и "x или y" возвращает y, если x равно false. См.Логические Операторы подробное описание. Оно короткое, но не очень четкое.


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 '')