将None转换为空字符串的最常用方法是什么?

214
什么是最地道的方法来完成以下任务?
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)

9
我喜欢你的原始语法。我认为它已经相当清晰易读了。 - GuiSim
1
@GuiSim:我可能有偏见,但我的答案读起来几乎像一个普通的英语句子... - SilentGhost
1
如果s为None,则返回一个空字符串;否则,返回s的字符串。问题中的代码读起来就像是一个普通的英语句子。 - Roger Pate
3
如果字符串s来自于字典查找,但是没有找到对应的键值,则使用dict.get(key, '') - smci
如果你只想要这个字符串转换用于输出格式化(例如用于打印),那么你可以直接使用 '... {}'.format(dict.get(1))`. - smci
17个回答

4

如果您需要与Python 2.4兼容,可以对上述内容进行变化。

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

2
如果涉及格式化字符串,您可以执行以下操作:
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
我们可以始终避免在以下场景中进行类型转换。
customer = "John"
name = str(customer)
if name is None
   print "Name is blank"
else: 
   print "Customer name : " + name

在上面的示例中,如果变量 customer 的值为 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
def xstr(s):
    return s if s else ''

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

5
这将针对所有类似于false的值返回一个空字符串,这不是发帖者所要求的。 - Kenan Banks

0

与Vinay Sajip的答案相同,但加入了类型注释,这样就不需要使用str()来转换结果了。

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

0

使用短路求值:

s = a or '' + b or ''

由于在字符串上使用 + 并不是一种很好的操作方式,建议使用格式化字符串:

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

2
这也会将所有类似于False的值转换为空字符串,而不仅仅是None。例如,空元组、列表和字典将被转换为空字符串,这不是OP指定的内容。 - Kenan Banks
“+”是两个字符串的完美操作符。当您尝试使用它来连接数十个字符串时,您会遇到麻烦。对于两个字符串而言,它可能比其他选项更;无论如何,这只是微不足道的差别。 - kquinn
我觉得这正是我需要的,因为用lambda或函数来替换一个“or”运算符对我来说有点过头了...我没有其他假值的情况——只有字符串或None。除了关于“+”运算符的评论可能取决于特定场景并且可能需要基准测试之外,这个答案不应该被评为-1。 - urban

-6

如果您使用的是Python v3.7,请使用F字符串。

xstr = F"{s}"

3
еҰӮжһңsдёәNoneпјҢиҝҷжҳҜй”ҷиҜҜзҡ„пјҢ并иҝ”еӣһеӯ—з¬ҰдёІ'None'гҖӮ - Lawrence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接