无的默认值但不是0

时间:2013-11-06 16:14:33

标签: python

这是什么惯用形式:

foo = <something complicated>
if foo is None : foo = foo_default

我无法使用foo = <something complicated> or foo_default,因为<something complicated>的0结果将替换为foo_default

4 个答案:

答案 0 :(得分:2)

您正在寻找conditional expression。 (这里以三元运算符的形式)

>>> foo = bar if baz else qux

或者,使用您的数据:

>>> foo = <something complicated>
>>> foo = foo_default if foo is None else foo

一个例子:

>>> foo = "A value"
>>> foo = foo if foo else "Nothing!"
>>> foo
'A value'
>>> foo = False
>>> foo = foo if foo else "Nothing!"
>>> foo
'Nothing!'

我会建议,因为在这种情况下似乎“复杂的东西”意味着一个函数,如果它返回foo_default None >

答案 1 :(得分:2)

使用conditional expression

foo = foo if foo is not None else foo_default

或倒置:

foo = foo_default if foo is None else foo

or类似,并非所有表达式都会被评估;在true_expr if test_expr else false_expr格式中,true_exprfalse_expr完全被忽略(未执行),具体取决于test_expr的结果。

这使您可以在调用不存在的方法之前测试特定的前提条件,例如:

foo = foo(some, argument) if foo is not None else 'default value'

让你测试和分配而不调用复杂的表达式两次,不;你仍然需要使用两个语句,而且没有办法解决这个问题。

答案 2 :(得分:2)

您目前所拥有的是惯用语,没有一种方法可以将此逻辑放在一行中。

当然,如果您经常使用此模式,则可以将其包装在函数中。

编辑:作为其他答案的比较,请考虑以下两段代码:

  • OP的当前版本:

    foo = <something complicated>
    if foo is None: foo = foo_default
    
  • 建议条件表达式的答案:

    foo = <something complicated>
    foo = foo_default if foo is None else foo
    

对我来说,使用可能评估为foo = foo的条件表达式不如使用单行if foo is None: foo = foo_default清楚。

答案 3 :(得分:0)

您也可以随时使用它:

foo = (foo, foo_default)[foo==None]