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

Mar*_*son 139 python string idioms

做以下事情的最惯用方法是什么?

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

s = xstr(a) + xstr(b)
Run Code Online (Sandbox Code Playgroud)

更新:我正在使用Tryptich的建议来使用str(s),这使得这个例程适用于除字符串之外的其他类型.Vinay Sajip的lambda建议给我留下了深刻的印象,但我想保持我的代码相对简单.

def xstr(s):
    if s is None:
        return ''
    else:
        return str(s)
Run Code Online (Sandbox Code Playgroud)

Sil*_*ost 137

def xstr(s):
    return '' if s is None else str(s)
Run Code Online (Sandbox Code Playgroud)

  • 我转过身来强调更多的commen案例:如果s不是则返回s其他没有"" (8认同)
  • 这是`..和..或..`失败的一个很好的例子,为什么if-else是首选.在s中有两个微妙的错误不是None和s或''`. (8认同)
  • @Ber:我会保持原样,避免双重否定. (5认同)
  • 这个语法是在2.5中引入的; 对于早期版本的Python,你可以使用`return s不是None和s或''`. (3认同)

Vin*_*jip 94

如果您知道该值将始终为字符串或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) # -> ''
Run Code Online (Sandbox Code Playgroud)

  • 这将转换为0和False(以及传递给bool()时评估为False的任何其他内容) (9认同)
  • 我不认为它是"迄今为止最为pythonic".这是其他语言中常见的习惯用语,我不认为在Python中使用它是错误的,但是为了避免这样的技巧而精确引入的条件表达式. (8认同)
  • 请注意,我在一开始就用"如果您知道值将始终为字符串或无"来限定我的答案. (4认同)
  • 这使得`[]`,`{}`等给出与'None`相同的结果,这是不希望的.`xstr(False)`,特别应该是``False'`而不是````.滥用lambdas是一个糟糕的例子,使用`def xstr(s):return s或""`ir你想把它全部放在一行上. (2认同)

Tri*_*ych 87

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

def xstr(s):
    if s is None:
        return ''
    return str(s)
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`xstr = lambda s:''如果s是None else str(s)` (11认同)
  • @guneysus他们不一样:`不是假==真'但是'假是没有==假'. (6认同)
  • 我喜欢输入`if not s:`而不是`if s is None` (2认同)

dor*_*vak 87

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

因为None是False,如果x是false,"x或y"返回y.有关详细说明,请参阅布尔运算符.这很简短,但不是很明确.

  • 如果`s`为0,False或任何有价值的值,则不起作用 (8认同)
  • 嗯,在操作要求中没有提到,所以我在这里看不到你的观点. (4认同)
  • @dorvak OP 非常明确地要求输出应该是 `''` iff `s is None`。所有其他输入应返回`s`(或修改后的请求中的`str(s)`)。 (3认同)
  • @fortea:那行不通。如果 `s` 是 `None`,`xstr()` 的结果应该是一个空字符串,但是 `str(None)` 给出了字符串 `"None"`,这是返回的内容(因为字符串 `" None"` 不是假值。 (2认同)

Ale*_*lli 57

return s or '' 对你陈述的问题会很好!

  • 值得注意的是,当s为False或0时(这不是原始字符串问题,而是更新的字符串问题),这将给出不同的结果.) (4认同)
  • @Oddthinking `s = False` 或 `s = 0` 很可能是其使用中的边缘情况,并且可以通过将其写为 `return str(s or '')` 来轻松缓解 (3认同)

Kry*_*ski 14

def xstr(s):
   return s or ""
Run Code Online (Sandbox Code Playgroud)

  • 这将返回`''`for`0`,`[]`,`{}`,`False`和类似false的值,这不是海报要求的. (3认同)

tob*_*ope 7

def xstr(s):
    return {None:''}.get(s, s)
Run Code Online (Sandbox Code Playgroud)

  • 不必要的慢(额外的字典构造和查找),并且更难阅读.非常unpythonic. (14认同)
  • get()函数调用意味着至少有一个额外的条件跳转. (4认同)

Dar*_*rio 7

功能方式(单线)

xstr = lambda s: '' if s is None else s
Run Code Online (Sandbox Code Playgroud)

  • 您应该使用 def 而不是将 lambda 分配给变量的 PEP 8 种类。lambda 唯一真正的优势是您可以将其作为表达式的一部分进行编写(例如传递给另一个函数),而这种优势在这样的代码中就消失了。我以前也这样做过,直到我注意到 def 可以写成一行,然后 PEP 8 向我展示了要走的路。永远追随巨蟒之神。 (3认同)
  • 它不是真正的单行,它只是写在一行*g* (2认同)

rad*_*tek 6

更新:

我现在主要用这个方法:

some_string = None
some_string or ''
Run Code Online (Sandbox Code Playgroud)

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

老的:

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

max(None, '')  # Returns blank
max("Hello", '') # Returns Hello
Run Code Online (Sandbox Code Playgroud)

  • 这是因为 'str' > 'NoneType',并且是特定于 CPython 的。来自 [手册](https://docs.python.org/2/library/stdtypes.html#comparisons):“除数字外的不同类型的对象按其类型名称排序”。此外,这在 Python 3000 中不起作用,因为不再允许类型间比较(TypeError: unorderable types: str() > NoneType())。参见 [Python 如何比较 string 和 int?](/sf/answers/228948261/) (5认同)

Wil*_*ich 6

一个巧妙的单线代码可以在其他一些答案上进行构建:

s = (lambda v: v or '')(a) + (lambda v: v or '')(b)
Run Code Online (Sandbox Code Playgroud)

甚至只是:

s = (a or '') + (b or '')
Run Code Online (Sandbox Code Playgroud)