Ответ 1
Если вы действительно хотите, чтобы ваша функция вела себя как встроенный str()
, но возвращает пустую строку, когда аргумент None, выполните следующее:
def xstr(s):
if s is None:
return ''
return str(s)
Каков самый идиоматический способ сделать следующее?
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)
Если вы действительно хотите, чтобы ваша функция вела себя как встроенный 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 '')
Поскольку None является False, а "x или y" возвращает y, если x является ложным. Подробнее см. Boolean Operators. Он короткий, но не очень явный.
return s or ''
будет отлично работать для вашей заявленной проблемы!
def xstr(s):
return s or ""
def xstr(s):
return {None:''}.get(s, s)
Функциональный способ (однострочный)
xstr = lambda s: '' if s is None else s
Чистый однострочный лайнер, чтобы сделать это здание на некоторые другие ответы:
s = (lambda v: v or '')(a) + (lambda v: v or '')(b)
или даже просто:
s = (a or '') + (b or '')
Изменение выше, если вам нужно быть совместимым с Python 2.4
xstr = lambda s: s is not None and s or ''
Я использую максимальную функцию:
max(None, '') #Returns blank
max("Hello",'') #Returns Hello
Работает как шарм;) Просто поместите свою строку в первый параметр функции.
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
В приведенном выше примере в случае, если значение переменной клиента равно 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 или даже значения нуждаются в дополнительном типе для любых манипуляций.
Если речь идет только о форматировании строк, вы можете сделать следующее:
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 '')
Используйте 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
будет возвращен ''
. В любом другом случае он вернет аргумент, преобразованный в строку, например, ваше исправленное издание.
Используйте строку F, если вы используете Python v3.7
xstr = F"{s}"