在Ruby中,如果要有条件地设置变量的值,可以执行以下操作:
foo = myhash[ "bar" ] || myhash[ "baz" ]
如果存在,它会将foo的值设置为myhash [“bar”],否则会将foo设置为myhash [“baz”]。如果两者都不存在,则将foo设置为nil。
在Python中,如果尝试这种类型的赋值,则会出现语法错误。此外,Python将在myhash [“baz”]上抛出KeyError,而不是将其设置为None。在我看来,在Python中有条件地设置foo的唯一方法是编写一个大的多行条件语句,但我真的很想在Ruby这样的行中执行此操作。有没有办法做到这一点?
答案 0 :(得分:3)
您收到语法错误,因为python or operator的语法不同,您需要明确要求Python使用.get()
method从字典查找中返回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']
而不是{{ 1}}。
答案 1 :(得分:0)
foo = myhash.get('bar', myhash['baz'])
如果'baz'键不存在,这确实会引发错误,但我仍然认为这是一个错误,并且不希望语言保持沉默。如果第二项也是可选项,并且您希望None
作为最终回退,则还可以使用.get
进行第二次查找。