在 Ruby 中,如果你想有条件地设置变量的值,你可以做这样的事情:
foo = myhash[ "bar" ] || myhash[ "baz" ]
如果存在,它会将 foo 的值设置为 myhash[ "bar" ],否则它将 foo 设置为 myhash[ "baz" ]。如果两者都不存在,它将 foo 设置为 nil。
在 Python 中,如果您尝试这种类型的赋值,您将收到语法错误。此外,Python 会在 myhash[ "baz" ] 上抛出一个 KeyError,而不是将其设置为 None。在我看来,在 Python 中有条件地设置 foo 的唯一方法是编写一个大的多行条件语句,但我真的很想像 Ruby 一样在一行中做到这一点。有什么办法可以做到这一点吗?
您会收到语法错误,因为 python 或运算符的语法不同,您需要显式要求 Python 使用 .get()
方法从字典查找中返回None
:
foo = myhash.get('bar') or myhash.get('baz')
由于.get()
采用默认值而不是查找键(默认为None
)返回,因此您也可以将其拼写为:
foo = myhash.get('bar', myhash.get('baz'))
这还有一个额外的好处,如果myhash['bar']
是 false-y(在布尔上下文中计算为 False,例如空序列或数字 0),它仍将返回 myhash['bar']
而不是 myhash['baz']
。
foo = myhash.get('bar', myhash['baz'])
如果"baz"键不存在,这确实会引发错误,但无论如何我都会认为这是一个错误,并且不希望语言将其静音。如果第二项也是可选的,并且您希望None
作为最终回退,则还可以使用 .get
进行第二次查找。