变量-Python条件赋值运算
是否存在与Ruby 2946449421195805805运算符等效的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个解决方案
139 votes
我很惊讶没有人提供这个答案。 它不像Ruby的locals()那样“内置”,但基本上是等效的,并且仍然是单一的:
foo = foo if 'foo' in locals() else 'default'
当然,locals()只是一本字典,因此您可以执行以下操作:
foo = locals().get('foo', 'default')
Keith Devens answered 2020-06-30T23:30:22Z
18 votes
不,替换为:
try:
v
except NameError:
v = 'bla bla'
但是,想要使用此构造是代码流程过于复杂的标志。 通常,您需要执行以下操作:
try:
v = complicated()
except ComplicatedError: # complicated failed
v = 'fallback value'
并且永远不要确定是否设置了get。 如果它是可以设置或不能设置的许多选项之一,请使用字典及其允许默认值的get方法。
phihag answered 2020-06-30T23:29:58Z
15 votes
我会用
x = 'default' if not x else x
比这里建议的所有替代方案都短得多,而且直截了当。 阅读,“如果未设置x,则将x设置为'default',否则将其保持为x。” 但是,如果您需要||=|、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中的符号表示法,则可以通过关注此家伙的hack来使||=|(或类似内容)超载:[http://code.activestate.com/recipes/384122-infix-operators/]
emish answered 2020-06-30T23:31:00Z
4 votes
不,不知道定义了哪些变量是一个错误,而不是Python中的功能。
改用dicts:
d = {}
d.setdefault('key', 1)
d['key'] == 1
d['key'] = 2
d.setdefault('key', 1)
d['key'] == 2
Jochen Ritzel answered 2020-06-30T23:31:24Z
3 votes
(不能发表评论,否则我只会这样做)我认为上述检查当地人的建议并不完全正确。 它应该是:
foo = foo if 'foo' in locals() or 'foo' in globals() else 'default'
在所有情况下都是正确的。
但是,尽管有人投票赞成,但我认为这与Ruby运算符也不是很好的相似之处。 由于Ruby运算符允许的不只是左侧的简单名称:
foo[12] ||= something
foo.bar ||= something
异常方法可能是最接近的模拟。
Jas answered 2020-06-30T23:31:58Z
1 votes
我通常通过以下方式执行此操作:
def set_if_not_exists(obj,attr,value):
if not hasattr(obj,attr): setattr(obj,attr,value)
Dog eat cat world answered 2020-06-30T23:32:17Z
1 votes
在Python 2.5及更高版本中有条件赋值-语法不是很明显,因此很容易遗漏。 这是您的操作方式:
x = true_value if condition else false_value
有关更多参考,请查看Python 2.5文档。
mainas answered 2020-06-30T23:32:42Z
0 votes
我认为您要寻找的是setdefault20方法:
(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方法所引用的键不存在时,29464528817314867867方法才会更改字典。
user1928764 answered 2020-06-30T23:33:11Z
-1 votes
我不确定我在这里是否正确理解了这个问题……尝试“读取”“未定义”变量名称的值将触发NameError(请参阅此处,Python具有“名称”,而不是变量...)。
==编辑==
正如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
>>>
(有关真值,请参见本段)
tsimbalar answered 2020-06-30T23:33:49Z
-8 votes
不,这不是胡说八道。我们20年来在Python中从未错过的东西。
Andreas Jung answered 2020-06-30T23:34:09Z