0

这个的惯用形式是什么:

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

我不能使用foo = <something complicated> or foo_default,因为 0 结果<something complicated>被替换为foo_default.

4

4 回答 4

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

于 2013-11-06T16:15:41.117 回答
2

使用条件表达式

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'

它不允许在不调用复杂表达式两次的情况下进行测试和分配,不;你仍然必须使用两个语句,而且没有办法解决这个问题。

于 2013-11-06T16:15:50.843 回答
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.

于 2013-11-06T16:16:08.527 回答
0

您也可以随时使用它:

foo = (foo, foo_default)[foo==None]
于 2013-11-06T16:21:07.193 回答