188

执行以下操作最惯用的方法是什么?

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

s = xstr(a) + xstr(b)

更新:我正在采纳 Trypich 的使用 str(s) 的建议,这使得该例程适用于字符串以外的其他类型。Vinay Sajip 的 lambda 建议给我留下了深刻的印象,但我想让我的代码保持相对简单。

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

16 回答 16

179

可能最短的是 str(s or '')

因为 None 为 False,如果 x 为 false,“x or y”返回 y。有关详细说明,请参阅布尔运算符。它很短,但不是很明确。

于 2012-08-31T12:28:40.650 回答
163
def xstr(s):
    return '' if s is None else str(s)
于 2009-06-23T19:21:12.293 回答
111

如果您确实希望您的函数表现得像str()内置函数,但在参数为 None 时返回一个空字符串,请执行以下操作:

def xstr(s):
    if s is None:
        return ''
    return str(s)
于 2009-06-23T19:28:18.147 回答
104

如果您知道该值将始终是字符串或无:

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) # -> ''
于 2009-06-23T22:01:12.500 回答
63

return s or ''可以很好地解决您提出的问题!

于 2009-06-24T03:08:53.613 回答
15
def xstr(s):
   return s or ""
于 2009-06-24T03:56:07.280 回答
10

功能方式(单线)

xstr = lambda s: '' if s is None else s
于 2009-06-23T19:31:58.323 回答
10

在其他一些答案的基础上进行此构建的简洁单线:

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

甚至只是:

s = (a or '') + (b or '')
于 2017-05-13T00:39:17.520 回答
8

更新:

我现在主要使用这种方法:

some_string = None
some_string or ''

如果 some_string 不是NoneType,则将在or那里短路并返回,否则返回空字符串。

老的:

Max 函数在 python 2.x 中有效,但在 3.x 中无效:

max(None, '')  # Returns blank
max("Hello", '') # Returns Hello
于 2014-04-23T19:56:45.657 回答
6
def xstr(s):
    return {None:''}.get(s, s)
于 2009-06-23T19:28:12.107 回答
4

如果您需要与 Python 2.4 兼容,则对上述内容进行变体

xstr = lambda s: s is not None and s or ''
于 2009-06-24T03:37:06.787 回答
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)
于 2018-07-16T10:26:24.097 回答
1
def xstr(s):
    return s if s else ''

s = "%s%s" % (xstr(a), xstr(b))
于 2009-06-23T19:25:57.853 回答
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 获取值甚至值需要进一步类型转换以进行任何操作时,这种情况非常常见。

于 2015-05-26T10:27:53.853 回答
0

使用短路评估:

s = a or '' + b or ''

由于 + 对字符串不是很好的操作,所以最好使用格式字符串:

s = "%s%s" % (a or '', b or '')
于 2009-06-23T19:37:21.730 回答
-5

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

xstr = F"{s}"
于 2019-09-30T05:27:22.160 回答