Python 条件赋值运算符
有没有和Ruby中的||=
操作符(“如果变量没有设置,就给变量赋值”)相对应的Python写法呢?
下面是Ruby中的一个例子:
variable_not_set ||= 'bla bla'
variable_not_set == 'bla bla'
variable_set = 'pi pi'
variable_set ||= 'bla bla'
variable_set == 'pi pi'
10 个回答
32
我会使用
x = 'default' if not x else x
这个方法比你们这里提到的其他所有方法都要简短,而且直接明了。可以理解为:“如果x没有被设置,就把x设为'default',否则就保持原来的x。”不过,如果你需要None
、0
、False
或者""
这些值也能被当作有效值的话,你就需要改变这个行为,比如:
valid_vals = ("", 0, False) # We want None to be the only un-set value
x = 'default' if not x and x not in valid_vals else x
这种情况其实很适合做成一个可以随处使用的函数:
setval_if = lambda val: 'default' if not val and val not in valid_vals else val
到时候,你可以这样使用它:
>>> x = None # To set it to something not valid
>>> x = setval_if(x) # Using our special function is short and sweet now!
>>> print x # Let's check to make sure our None valued variable actually got set
'default'
最后,如果你真的很想用Ruby那种中缀写法,你可以通过这个人的技巧来重载||=|
(或者类似的东西):http://code.activestate.com/recipes/384122-infix-operators/
222
我很惊讶没有人提供这个答案。虽然它没有Ruby的||=
那么“内置”,但基本上是等价的,而且还是一行代码:
foo = foo if 'foo' in locals() else 'default'
当然,locals()
其实就是一个字典,所以你可以这样做:
foo = locals().get('foo', 'default')
16
不,这里应该用的是:
try:
v
except NameError:
v = 'bla bla'
不过,如果你想用这种写法,那说明你的代码可能太复杂了。通常,你应该这样做:
try:
v = complicated()
except ComplicatedError: # complicated failed
v = 'fallback value'
这样就不会担心 v
是否被设置了。如果有很多选项可以选择设置或者不设置,建议使用字典和它的 get
方法,这样可以设定一个默认值。