是否存在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'
是否存在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'
我很惊讶没有人提供这个答案。它不像 Ruby 的 ||=
一样是内置的,但基本上等效且仍然只有一行:
foo = foo if 'foo' in locals() else 'default'
当然,locals()
只是一个字典,所以你可以这样做:
foo = locals().get('foo', 'default')
我会使用
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/
x = "value1" if True else "value2"
。
一般来说,
x = 'value1' if condition else 'value2'
。 - Maubeh没有,替换的内容是:
try:
v
except NameError:
v = 'bla bla'
然而,想要使用这种结构通常意味着代码流程过于复杂。通常情况下,你会执行以下步骤:
try:
v = complicated()
except ComplicatedError: # complicated failed
v = 'fallback value'
并且永远不要不确定 v
是否设置。 如果它是可以设置或不设置的多个选项之一,请使用字典及其get
方法,该方法允许设置默认值。
except:
。 - user395760complicated()
的性质做出具体的假设。已添加。 - phihagtry . . .except
来控制流程是不好的实践。当尝试分配变量时,应该在出现问题时使用异常。 - Paul D.x = true_value if condition else false_value
如需更多参考,请查看Python 2.5文档。
variable = "bla bla" if not variable else variable
- undefined(无法评论,否则我会这样做)我认为检查上面的本地内容的建议不太正确。应该是:
foo = foo if 'foo' in locals() or 'foo' in globals() else 'default'
在所有情况下都正确。
然而,尽管它得到了赞同,我认为这甚至不是Ruby运算符的一个好比喻。因为Ruby运算符允许左侧不仅仅是一个简单的名称:
foo[12] ||= something
foo.bar ||= something
d = {}
d.setdefault('key', 1)
d['key'] == 1
d['key'] = 2
d.setdefault('key', 1)
d['key'] == 2
我通常是这样做的:
def set_if_not_exists(obj,attr,value):
if not hasattr(obj,attr): setattr(obj,attr,value)
我这样做只是为了分享,以防对问题发起人或其他人有所帮助...
def iff(value, default):
return default if not value else value
使用方法:
z = iff(x,y) # z = x if and only if x is not null otherwise y
我认为如果你在字典中查找某些内容,你需要的是 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
方法仅在所引用的键不存在时才更改字典。
我不确定我是否正确理解了问题...试图“读取”一个“未定义”的变量名称的值将触发一个NameError
。(请参见{{link1:这里,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
>>>
(请参见有关真值的段落)
None
。 - user395760
false
或nil
)时才会被设置。当然,在将0和""视为false的语言中,这种区别更为重要,但仍然需要注意。 - user395760