Python: most idiomatic way to convert None to empty string?

StringPythonIdioms

String Problem Overview


What is the most idiomatic way to do the following?

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

s = xstr(a) + xstr(b)

update: I'm incorporating Tryptich's suggestion to use str(s), which makes this routine work for other types besides strings. I'm awfully impressed by Vinay Sajip's lambda suggestion, but I want to keep my code relatively simple.

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

String Solutions


Solution 1 - String

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.

Solution 2 - String

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

Solution 3 - String

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)

Solution 4 - String

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

Solution 5 - String

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

Solution 6 - String

def xstr(s):
   return s or ""

Solution 7 - String

Functional way (one-liner)

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

Solution 8 - String

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

Solution 9 - String

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

Solution 10 - String

def xstr(s):
    return {None:''}.get(s, s)

Solution 11 - String

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

xstr = lambda s: s is not None and s or ''

Solution 12 - String

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)

Solution 13 - String

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

s = "%s%s" % (xstr(a), xstr(b))

Solution 14 - String

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.

Solution 15 - String

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

Solution 16 - String

Use F string if you are using python v3.7

xstr = F"{s}"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMark HarrisonView Question on Stackoverflow
Solution 1 - StringdorvakView Answer on Stackoverflow
Solution 2 - StringSilentGhostView Answer on Stackoverflow
Solution 3 - StringKenan BanksView Answer on Stackoverflow
Solution 4 - StringVinay SajipView Answer on Stackoverflow
Solution 5 - StringAlex MartelliView Answer on Stackoverflow
Solution 6 - StringKrystian CybulskiView Answer on Stackoverflow
Solution 7 - StringDarioView Answer on Stackoverflow
Solution 8 - StringWillem van KetwichView Answer on Stackoverflow
Solution 9 - StringradtekView Answer on Stackoverflow
Solution 10 - StringtobidopeView Answer on Stackoverflow
Solution 11 - StringPeter EricsonView Answer on Stackoverflow
Solution 12 - StringmaciekView Answer on Stackoverflow
Solution 13 - StringphillcView Answer on Stackoverflow
Solution 14 - StringPralhad Narsinh SonarView Answer on Stackoverflow
Solution 15 - StringsharjeelView Answer on Stackoverflow
Solution 16 - Stringguagay_wkView Answer on Stackoverflow