Python:将NONE转换为空字符串的最惯用方法?

做下面的事情最习惯的方法是什么?

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


s = xstr(a) + xstr(b)

更新:,我结合了Tryptich的建议来使用str(s),这使得这个例程适用于字符串之外的其他类型。Vinay Sajip的Lambda建议给我留下了非常深刻的印象,但我想让我的代码相对简单。

def xstr(s):
if s is None:
return ''
else:
return str(s)
273790 次浏览
def xstr(s):
return '' if s is None else str(s)
def xstr(s):
return s if s else ''


s = "%s%s" % (xstr(a), xstr(b))
def xstr(s):
return {None:''}.get(s, s)

If you actually want your function to behave like the str() built-in, but return an empty string when the argument is None, do this:

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

Functional way (one-liner)

xstr = lambda s: '' if s is None else s

Use short circuit evaluation:

s = a or '' + b or ''

Since + is not a very good operation on strings, better use format strings:

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

If you know that the value will always either be a string or 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) # -> ''

return s or '' will work just fine for your stated problem!

Variation on the above if you need to be compatible with Python 2.4

xstr = lambda s: s is not None and s or ''
def xstr(s):
return s or ""

Probably the shortest would be str(s or '')

Because None is False, and "x or y" returns y if x is false. See Boolean Operators for a detailed explanation. It's short, but not very explicit.

UPDATE:

I mainly use this method now:

some_string = None
some_string or ''

If some_string was not NoneType, the or would short circuit there and return it, otherwise it returns the empty string.

OLD:

Max function worked in python 2.x but not in 3.x:

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

We can always avoid type casting in scenarios explained below.

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

In the example above in case variable customer's value is None the it further gets casting while getting assigned to 'name'. The comparison in 'if' clause will always fail.

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)

Above example will work properly. Such scenarios are very common when values are being fetched from URL, JSON or XML or even values need further type casting for any manipulation.

A neat one-liner to do this building on some of the other answers:

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

or even just:

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

If it is about formatting strings, you can do the following:

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)

Use F string if you are using python v3.7

xstr = F"{s}"

Same as Vinay Sajip's answer with type annotations, which precludes the needs to str() the result.

def xstr(s: Optional[str]) -> str:
return '' if s is None else s