Python条件赋值运算符

时间:2011-06-19 12:21:12

标签: 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'

10 个答案:

答案 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。”如果您需要None0False""作为有效值,则需要更改此行为,例如:

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
>>> 

(见this paragraph about Truth Values

答案 9 :(得分:-8)

不,没有那样的废话。 我们在Python中没有错过20年的东西。