更新。 我采纳了Tryptich的建议,使用str(s),这使得这个例程可以用于除字符串以外的其他类型。 我对Vinay Sajip的lambda建议印象非常深刻,但我想保持我的代码相对简单。

def xstr(s):
    if s is None:
        return ''
    else:
        return str(s)
    
5 个评论
我喜欢你的原始语法。我认为它已经相当清晰,易于阅读。
@GuiSim:我可能有偏见,但我的答案读起来几乎像一个正常的英语句子......
"如果s是None,那么返回一个空字符串;否则,返回[string of] s。" 问题中的代码读起来也像一个正常的英文句子。
smci
a)如果字符串s来自于一个没有找到键的dict查询,那么就使用dict.get(key, '')
smci
b) 如果你只想把这个字符串转换为输出格式(例如用于打印),那么你可以直接做'...{}'.format(dict.get(1))`。
string
python
idioms
Mark Harrison
Mark Harrison
发布于 2009-06-24
16 个回答
dorvak
dorvak
发布于 2019-09-30
已采纳
0 人赞同

最短的可能是 替换代码0

因为None是假的,而 "x或y "在x是假的情况下返回y。见布尔运算符的详细解释。它很短,但不是很明确。

这真是太好了,谢谢你!从未想过以这种方式使用or
如果s是0、False或任何虚假的值,这将不起作用。
好吧,这在操作者的要求中没有提到,所以我不明白你在这里的观点。
@dorvak OP对输出应该是''的要求非常明确,如果s is None。所有其他的输入都应该返回s(或者在修改后的请求中的str(s))。
@fortea:那是行不通的。如果sNonexstr()的结果应该是一个空字符串,但是str(None)给出的是字符串"None",这就是返回的结果(因为字符串"None"不是一个假的值。
SilentGhost
SilentGhost
发布于 2019-09-30
0 人赞同
def xstr(s):
    return '' if s is None else str(s)
    
这个语法是在2.5中引入的;对于早期版本的Python,你可以使用return s is not None and s or ''
Ber
我想把它转过来,强调更常见的情况:如果s不是无,则返回s,否则""
@Ber:我将保持原样,以避免双重否定。
这是一个很好的例子,说明.. and .. or ..是如何失败的,以及为什么if-else是首选。 在s is not None and s or ''中,有两个微妙的错误。
return '' if not s else str(s)
Kenan Banks
Kenan Banks
发布于 2019-09-30
0 人赞同

如果你真的想让你的函数表现得像str()内置的,但当参数为None时返回一个空字符串,请这样做。

def xstr(s):
    if s is None:
        return ''
    return str(s)
    
我保留了其他的,但感谢你的str(s)提示,这样可以处理多种类型。
Or simply xstr = lambda s: '' if s is None else str(s)
I love typing if not s: instead of if s is None
Lynn
@guneysus 他们不一样。not False == TrueFalse is None == False
谢谢 @Lynn 你是对的。我意识到了我的错误。但我知道(或假设)s总是一个str/unicode类型或None。是的,False是一个值,但我更喜欢这种方式,可以节省我的键盘和眼睛;)
Vinay Sajip
Vinay Sajip
发布于 2019-09-30
0 人赞同

如果你知道该值将永远是一个字符串或无。

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) # -> ''
    
Matt
到目前为止,是最具有pythonic的。 python将无、空列表、空字符串、0等视为假。 还使用了 or 语句返回第一个元素为真或最后一个元素给 or (或一组 or) 的事实。 此外,这还使用了lambda函数。 我想给你+10,但显然它不允许我这么做。
这将转换0和False(以及其他任何在传递给bool()时评估为False的东西)。
我不认为它是 "迄今为止最pythonic的"。 在其他语言中,这是一个常见的习语,我不认为在 Python 中使用它是错误的,但条件表达式的引入正是为了避免像这样的把戏。
这使得[]{}等的结果与None相同,这不是我们想要的。 尤其是xstr(False),应该是"False"而不是""。 滥用lambdas是一个糟糕的例子,使用def xstr(s): return s or "",你想把它放在一行。
请注意,我在一开始就用 "如果你知道值永远是一个字符串或无 "来限定我的答案。
Alex Martelli
Alex Martelli
发布于 2019-09-30
0 人赞同

替换代码0】对你所说的问题会有很好的效果。

值得注意的是,当s为False或0时,这将得到不同的结果(这不是原来的字符串问题,而是更新的问题)。
@Oddthinking s = Falses = 0很可能是它使用中的一个边缘案例,可以通过写成return str(s or '')来轻松缓解。
@WillemvanKetwich:这有完全相同的问题:s(False) 应该返回'False',而不是''。s(0) 应该返回'0',而不是''。同样,对于一个定义了 __bool__ 或 __nonzero__ 的对象,也是如此。
@Oddthinking 我明白你的意思。在任何情况下,如果它是专门用于字符串对象的,比如在OP的问题中,它不应该是一个问题。
@WillemvanKetwich:请看一下更新后的问题和我评论中的注意事项--这已经被涵盖了。
Krystian Cybulski
Krystian Cybulski
发布于 2019-09-30
0 人赞同
def xstr(s):
   return s or ""
    
StvnW
对于0[]{}False和类似于false的值,这会返回'',这并不是发帖人所要求的。
只要把str([...])放在s周围。 [替换代码0]。
Dario
Dario
发布于 2019-09-30
0 人赞同

职能方式(单行本)

xstr = lambda s: '' if s is None else s
    
"def xstr(s): return '' if s is None else s " 也是一个上线,毕竟python对空格的要求并不严格。
这不是真正的单行本,它只是用一行字写的g
在什么意义上它不是一个真正的onliner? 在你的解释器中检查一下--这不是一个语法错误。就所有的意图和目的而言,它比lambda更真实。
Guy
PEP 8种,你应该使用def而不是将lambda分配给一个变量。lambda唯一真正的优势是你可以作为表达式的一部分来写(例如传递给另一个函数),而这个优势在这样的代码中就失去了。我以前也是这样做的,直到我注意到def可以用一行来写,然后PEP 8给我指明了方向。永远跟随Python之神。
Willem van Ketwich
Willem van Ketwich
发布于 2019-09-30
0 人赞同

在其他一些答案的基础上,做这个整齐的单行线。

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

or even just:

s = (a or '') + (b or '')
    
Why even mention (lambda v: v or '')?
Why not? 2 tips for the price of 1! 😀
请注意,False和空列表也将变成''。
替换代码0】也是如此,等等。
radtek
radtek
发布于 2019-09-30
0 人赞同

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

some_string = None
some_string or ''

如果some_string不是NoneTypeor会在那里短路并返回它,否则会返回空字符串。

Max函数在Python 2.x中工作,但在3.x中不工作。

max(None, '')  # Returns blank
max("Hello", '') # Returns Hello
    
plok
This works because 'str' > 'NoneType', and is CPython specific. From the 手册: "Objects of different types except numbers are ordered by their type names". Also, this won't work in Python 3000, since inter-type comparison is no longer allowed (TypeError: unorderable types: str() > NoneType()). See Python是如何比较字符串和int的?
很高兴知道,谢谢,所以用python 3.x的兼容代码前进不是一个好主意。
tobidope
tobidope
发布于 2019-09-30
0 人赞同
def xstr(s):
    return {None:''}.get(s, s)
    
我认为,这是个相当pythonic的做法 -- 这个怎么样。"xstr = lambda s : {None:''}.get(s,s)" -- 将整个事情简化为一句话。
不必要的慢(额外的口令构造和查找),而且更难读。相当不严谨。
你是对的。它相当简陋,但它避免了python字节码中的条件跳跃。
get()函数的调用意味着至少有一个额外的条件性跳转。
如果不了解问题或不查找get,我就不能说这应该做什么。
Peter Ericson
Peter Ericson
发布于 2019-09-30
0 人赞同

如果你需要与Python 2.4兼容,可以在上述基础上做一些改变

xstr = lambda s: s is not None and s or ''
    
maciek
maciek
发布于 2019-09-30
0 人赞同

如果是关于字符串的格式化,你可以做以下工作。

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)
    
phillc
phillc
发布于 2019-09-30
0 人赞同
def xstr(s):
    return s if s else ''
s = "%s%s" % (xstr(a), xstr(b))
    
这将为所有类似于false的值返回一个空字符串,这不是发帖人所要求的。
Pralhad Narsinh Sonar
Pralhad Narsinh Sonar
发布于 2019-09-30
0 人赞同

在下面解释的情况下,我们总是可以避免类型转换。

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中获取数值,甚至需要进一步的类型转换来进行任何操作时,这种情况非常常见。

sharjeel
sharjeel
发布于 2019-09-30
0 人赞同

使用短路评估。

s = a or '' + b or ''

由于 "+"在字符串上不是一个很好的操作,最好使用格式化字符串。

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