Python: самый идиоматический способ преобразования None в пустую строку? - PullRequest
127 голосов
/ 23 июня 2009

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

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

s = xstr(a) + xstr(b)

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

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

Ответы [ 15 ]

129 голосов
/ 23 июня 2009
def xstr(s):
    return '' if s is None else str(s)
90 голосов
/ 24 июня 2009

Если вы знаете, что значение всегда будет либо строкой, либо 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) # -> ''
78 голосов
/ 23 июня 2009

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

def xstr(s):
    if s is None:
        return ''
    return str(s)
75 голосов
/ 31 августа 2012

Вероятно, самый короткий будет str(s or '')

Потому что None равно False, а "x or y" возвращает y, если x равно false. См. Булевы операторы для подробного объяснения. Это коротко, но не очень ясно.

56 голосов
/ 24 июня 2009

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

14 голосов
/ 24 июня 2009
def xstr(s):
   return s or ""
7 голосов
/ 23 июня 2009

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

xstr = lambda s: '' if s is None else s
6 голосов
/ 23 июня 2009
def xstr(s):
    return {None:''}.get(s, s)
4 голосов
/ 13 мая 2017

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

s = (lambda v: v or '')(a) + (lambda v: v or '')(b)

или даже просто:

s = (a or '') + (b or '')
4 голосов
/ 23 апреля 2014

Я использую функцию Макс:

max(None, '')  #Returns blank
max("Hello",'') #Returns Hello

Работает как шарм;) Просто поместите вашу строку в первый параметр функции.

...