如果在Python中没有返回默认值,是否有简写?

nfw*_*nfw 182 python

在C#中,我可以说x ?? "",如果x不为null,它将给出x,如果x为null,则为空字符串.我发现它对于使用数据库很有用.

如果Python在变量中找到None,有没有办法返回默认值?

sta*_*ker 277

您可以使用or运算符:

return x or "default"
Run Code Online (Sandbox Code Playgroud)

请注意,"default"如果x是任何有价值的值,这也会返回,包括空列表,0,空字符串,甚至datetime.time(0)(午夜).

  • 如果x是任何有价值的值,这将返回"默认",例如"无","[]","""等等,但通常足够好且看起来更干净. (34认同)
  • ``x或默认``是**反模式**!它是经常难以调试的错误源,因为由于许多微妙的原因,即使x是期望值,x也可以评估为false. (25认同)
  • 我认为这是一个不好的做法 - 这使用一些转换为'x'的bool,如果没有找到这样的转换,这将失败(例如,pandas DataFrames和numpy数组) (21认同)
  • **警告:AntiPattern**:如果x为None else x,则使用`return"default" (21认同)
  • 如果x为0(零),则返回"default" (15认同)
  • 我同意QuantMetropolis和Alleo.非常糟糕的做法.如果需要默认值,那么这是因为您知道x可能会出现一些您想要替换的不规则值(或类型).因此,您的代码应检测特定情况.这不仅可以避免意外的副作用(例如,当x具有合法值零时提供默认值),但它也为维护程序员(可能是您以后的自己)提供了您打算在此处发生的文档. (5认同)
  • 这是完全有效的,而不是反模式。就像其他所有事情一样,您需要知道它的作用:它不仅忽略 None,还忽略所有“假”值,包括 0、""、[] 和 {}(以及一些更特殊的情况,例如覆盖他们的评估)。如果这就是您想要的(在很多情况下确实如此),那就太完美了。 (4认同)
  • 所以`time.now() == False` 一天一次。那太好了。 (2认同)

bre*_*yne 96

return "default" if x is None else x
Run Code Online (Sandbox Code Playgroud)

尝试以上.

  • 嗯...还可以,但不如c#,因为你需要为x 创建一个变量。例如,在 C# 中,x 可以是函数调用,例如 `return foo() ?? “默认”`。但在 python 中你需要 `x = foo(); 如果 x 不是 None else“default”,则返回 x。没那么漂亮。 (4认同)
  • 它的 Pythonic #PEP20 Python 之禅 显式优于隐式。如果需要的话,最好只处理“无”情况。 (3认同)
  • 否则,只需删除`is None`,然后让`x`作为布尔值自行计算. (2认同)
  • 这也是在“fastai”库的便利函数“ifnone”中实现的方式。因此,如果您正在使用该库,那么这就是您的简写。 (2认同)

Ash*_*ary 38

您可以使用条件表达式:

x if x is not None else some_value
Run Code Online (Sandbox Code Playgroud)

例:

In [22]: x = None

In [23]: print x if x is not None else "foo"
foo

In [24]: x = "bar"

In [25]: print x if x is not None else "foo"
bar
Run Code Online (Sandbox Code Playgroud)


小智 13

x or "default"
Run Code Online (Sandbox Code Playgroud)

效果最好 - 我甚至可以使用内联函数调用,而无需执行两次或使用额外的变量:

self.lineEdit_path.setText( self.getDir(basepath) or basepath )
Run Code Online (Sandbox Code Playgroud)

我在打开Qt dialog.getExistingDirectory()和取消时使用它,它返回空字符串.

  • _"效果最好"_ - 除非_x_可以具有合法的假值.那么这种语法将导致细微的,难以调试的错误. (7认同)
  • 如果您使用数字,则很危险 例如: None 或 0 返回 0 \n 0 或 None 不返回任何内容 (3认同)