Har*_*tor 45 python variables conditional
是否存在Python等效于Ruby ||=运算符("如果变量未设置则设置变量")?
Ruby中的示例:
variable_not_set ||= 'bla bla'
variable_not_set == 'bla bla'
variable_set = 'pi pi'
variable_set ||= 'bla bla'
variable_set == 'pi pi'
Run Code Online (Sandbox Code Playgroud)
Kei*_*ens 141
我很惊讶没有人提供这个答案.它不像Ruby那样"内置",||=但它基本上是等效的,仍然是单行的:
foo = foo if 'foo' in locals() else 'default'
Run Code Online (Sandbox Code Playgroud)
当然,locals()这只是一本字典,所以你可以这样做:
foo = locals().get('foo', 'default')
Run Code Online (Sandbox Code Playgroud)
phi*_*hag 18
不,更换是:
try:
v
except NameError:
v = 'bla bla'
Run Code Online (Sandbox Code Playgroud)
但是,想要使用此构造是代码流过于复杂的标志.通常,您会执行以下操作:
try:
v = complicated()
except ComplicatedError: # complicated failed
v = 'fallback value'
Run Code Online (Sandbox Code Playgroud)
并且永远不确定是否v设定.如果它是可以设置或不设置的众多选项之一,请使用字典及其get允许默认值的方法.
emi*_*ish 16
我会用
x = 'default' if not x else x
Run Code Online (Sandbox Code Playgroud)
比这里提出的所有替代方案都短得多,并且直截了当.读取,"如果未设置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
Run Code Online (Sandbox Code Playgroud)
这种事情也只是乞求变成一个你可以轻松使用的功能:
setval_if = lambda val: 'default' if not val and val not in valid_vals else val
Run Code Online (Sandbox Code Playgroud)
此时,您可以将其用作:
>>> 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'
Run Code Online (Sandbox Code Playgroud)
最后,如果你真的错过了你的Ruby中缀表示法,你可以||=|通过跟随这个人的黑客来重载(或类似的东西):http://code.activestate.com/recipes/384122-infix-operators/
Python 2.5 及更高版本中有条件赋值 - 语法不是很明显,因此很容易错过。这是你如何做到的:
x = true_value if condition else false_value
Run Code Online (Sandbox Code Playgroud)
如需进一步参考,请查看Python 2.5 文档。
小智 5
(无法发表评论,否则我就会这样做)我认为上面检查当地人的建议不太正确。它应该是:
foo = foo if 'foo' in locals() or 'foo' in globals() else 'default'
Run Code Online (Sandbox Code Playgroud)
在所有情况下都是正确的。
然而,尽管它得到了支持,但我认为这也不是 Ruby 运算符的一个很好的模拟。由于 Ruby 运算符在左侧不仅仅允许一个简单的名称:
foo[12] ||= something
foo.bar ||= something
Run Code Online (Sandbox Code Playgroud)
异常方法可能是最接近的模拟。