是否存在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'
答案 0 :(得分:117)
我很惊讶没有人提供这个答案。它不像Ruby的||=
那样“内置”,但它基本上是等同的,仍然是一个单行:
foo = foo if 'foo' in locals() else 'default'
当然,locals()
只是一本字典,所以你可以这样做:
foo = locals().get('foo', 'default')
答案 1 :(得分:18)
不,替换是:
try:
v
except NameError:
v = 'bla bla'
但是,想要使用此构造是代码流过于复杂的标志。通常,您会执行以下操作:
try:
v = complicated()
except ComplicatedError: # complicated failed
v = 'fallback value'
并且永远不确定是否设置了v
。如果它是可以设置或不设置的众多选项之一,请使用字典及其{{3}}方法,该方法允许使用默认值。
答案 2 :(得分:12)
我会用
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/
答案 3 :(得分:4)
不,不知道定义了哪些变量是一个错误,而不是Python中的一个功能。
改用dicts:
d = {}
d.setdefault('key', 1)
d['key'] == 1
d['key'] = 2
d.setdefault('key', 1)
d['key'] == 2
答案 4 :(得分:2)
(不能评论或我会这样做)我相信检查上述当地人的建议并不完全正确。它应该是:
foo = foo if 'foo' in locals() or 'foo' in globals() else 'default'
在所有情况下都是正确的。
然而,尽管它的赞成,但我认为即使这是一个很好的模拟Ruby运算符。由于Ruby运算符不仅仅允许左侧的简单名称:
foo[12] ||= something
foo.bar ||= something
异常方法可能是最接近模拟的。
答案 5 :(得分:1)
我通常按以下方式执行此操作:
def set_if_not_exists(obj,attr,value):
if not hasattr(obj,attr): setattr(obj,attr,value)
答案 6 :(得分:1)
Python 2.5及更高版本中存在条件赋值 - 语法不是很明显,因此很容易遗漏。这是你如何做到的:
x = true_value if condition else false_value
如需进一步参考,请查看Python 2.5 docs。
答案 7 :(得分:0)
我认为你要找的是,如果你在字典里找东西,那就是setdefault
方法:
(Pdb) we=dict()
(Pdb) we.setdefault('e',14)
14
(Pdb) we['e']
14
(Pdb) we['r']="p"
(Pdb) we.setdefault('r','jeff')
'p'
(Pdb) we['r']
'p'
(Pdb) we[e]
*** NameError: name 'e' is not defined
(Pdb) we['e']
14
(Pdb) we['q2']
*** KeyError:' q2' (PDB)
在我的示例中需要注意的重要一点是setdefault
方法会更改字典,当且仅当setdefault
方法引用的键不存在时才会出现。
答案 8 :(得分:-1)
我不确定我是否理解这个问题...试图“读取”“未定义”变量名称的值将触发NameError
。 (见here, that Python has "names",而不是变量......)。
==编辑==
正如delnan的评论所指出的,下面的代码并不健全,并会在很多情况下破解......
尽管如此,如果您的变量“存在”,但具有某种虚拟值,例如None
,则以下内容可行:
>>> my_possibly_None_value = None
>>> myval = my_possibly_None_value or 5
>>> myval
5
>>> my_possibly_None_value = 12
>>> myval = my_possibly_None_value or 5
>>> myval
12
>>>
答案 9 :(得分:-8)
不,没有那样的废话。 我们在Python中没有错过20年的东西。