Python条件赋值运算符

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允许默认值的方法.

  • 不,你[不要使用`except:`](http://docs.python.org/howto/doanddont.html#except)。 (2认同)

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/

  • 这是一个错误的答案,如果x不存在则会失败.由于该问题要求测试存在的方法,因此该解决方案将不起作用. (6认同)
  • 你的第一个例子不起作用:>>> x ='default'如果不是x else x Traceback(最近一次调用last):文件"<stdin>",第1行,在<module>中NameError:name'x'是没有定义的 (4认同)
  • 这个答案解决了“条件赋值”的问题。如果未设置变量,则设置该变量。当然,右边的所有内容都必须定义,否则你会得到一个错误(我只是把它当作伪代码)。`x = "value1" if True else "value2"`。一般来说。`x = '值1' if 条件 else '值2'` (2认同)

mai*_*nas 6

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)

异常方法可能是最接近的模拟。