这是什么惯用形式:
foo = <something complicated>
if foo is None : foo = foo_default
我无法使用foo = <something complicated> or foo_default
,因为<something complicated>
的0结果将替换为foo_default
。
答案 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
答案 1 :(得分: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_expr
或false_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]