这个的惯用形式是什么:
foo = <something complicated>
if foo is None : foo = foo_default
我不能使用foo = <something complicated> or foo_default
,因为 0 结果<something complicated>
被替换为foo_default
.
这个的惯用形式是什么:
foo = <something complicated>
if foo is None : foo = foo_default
我不能使用foo = <something complicated> or foo_default
,因为 0 结果<something complicated>
被替换为foo_default
.
您正在寻找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
使用条件表达式:
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_expr
被false_expr
完全忽略(不执行),具体取决于test_expr
.
这使您可以在调用不存在的方法之前测试特定的前置条件,例如:
foo = foo(some, argument) if foo is not None else 'default value'
它不允许您在不调用复杂表达式两次的情况下进行测试和分配,不;你仍然必须使用两个语句,而且没有办法解决这个问题。
您目前拥有的是惯用的,没有一种好方法可以将此逻辑放在一行中。
当然,如果您经常使用这种模式,您可以将其包装在一个函数中。
编辑:作为其他答案之间的比较,请考虑以下两段代码:
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
.
您也可以随时使用它:
foo = (foo, foo_default)[foo==None]