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

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

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

s = xstr(a) + xstr(b)

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

def xstr(s):
    if s is None:
        return ''
    else:
        return str(s)
+136
источник поделиться
17 ответов

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

def xstr(s):
    if s is None:
        return ''
    return str(s)
+84
источник
def xstr(s):
    return '' if s is None else str(s)
+134
источник

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

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

Поскольку None является False, а "x или y" возвращает y, если x является ложным. Подробнее см. Boolean Operators. Он короткий, но не очень явный.

+83
источник

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

+57
источник
def xstr(s):
   return s or ""
+14
источник
def xstr(s):
    return {None:''}.get(s, s)
+7
источник

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

xstr = lambda s: '' if s is None else s
+7
источник

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

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

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

s = (a or '') + (b or '')
+5
источник

Изменение выше, если вам нужно быть совместимым с Python 2.4

xstr = lambda s: s is not None and s or ''
+4
источник

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

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

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

+4
источник
def xstr(s):
    return s if s else ''

s = "%s%s" % (xstr(a), xstr(b))
+1
источник

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

customer = "John"
name = str(customer)
if name is None
   print "Name is blank"
else: 
   print "Customer name : " + name

В приведенном выше примере в случае, если значение переменной клиента равно None, оно дополнительно получает кастинг при присвоении имени "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 или даже значения нуждаются в дополнительном типе для любых манипуляций.

+1
источник

Если речь идет только о форматировании строк, вы можете сделать следующее:

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)
+1
источник

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

s = a or '' + b or ''

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

s = "%s%s" % (a or '', b or '')
0
источник

Используйте or и str(...). Простой и чистый:

def xstr(s): 
   return str(s) or ''

Или также в одной строке:

s = (str(a) or '') + (str(b) or '')

Как это работает?

Оператор or в python начинает оценивать выражение первого аргумента. Если оно True, оно возвращает его, в противном случае оно продолжается и оценивает следующее. Если ни один из них не является True, он возвращает последний аргумент, который является последним аргументом выражения.

Строка всегда True, за исключением пустого strig (''). Число (только в python3 только int) всегда True за исключением 0 (как и большинство C-вдохновленных языков).

str(...) преобразовать в строку:

  • str(0)'0'
  • str([])'[]'
  • str({})'{}'
  • str(False)'False'

Итак, только если аргумент None будет возвращен ''. В любом другом случае он вернет аргумент, преобразованный в строку, например, ваше исправленное издание.

0
источник

Используйте строку F, если вы используете Python v3.7

xstr = F"{s}"
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос