【问题标题】:ruby-style conditional setting of python variablepython变量的ruby风格条件设置
【发布时间】:2012-10-07 00:34:53
【问题描述】:

在 Ruby 中,如果你想有条件地设置变量的值,你可以这样做:

foo = myhash[ "bar" ] || myhash[ "baz" ]

如果 foo 存在,它会将 foo 的值设置为 myhash[ "bar" ],否则会将 foo 设置为 myhash[ "baz" ]。如果两者都不存在,它会将 foo 设置为 nil。

在 Python 中,如果你尝试这种类型的赋值,你会得到一个语法错误。此外,Python 将在 myhash[ "baz" ] 上抛出 KeyError,而不是将其设置为 None。在我看来,在 Python 中有条件地设置 foo 的唯一方法是编写一个大的多行条件语句,但我真的很想像 Ruby 那样在一行中执行此操作。有没有办法做到这一点?

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    您收到语法错误,因为 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'] 而不是 myhash['baz']

    【讨论】:

    • 请注意,对于 myhash['bar'] 的虚假值(例如零或空字符串),第一个失败。 Ruby 版本的行为不同(只有 false 和 nil 是虚假的),这就是他们侥幸逃脱的原因。
    • @delnan:是的,这就是为什么第二个拼写更好。
    【解决方案2】:
    foo = myhash.get('bar', myhash['baz'])
    

    如果 'baz' 键不存在,这确实会引发错误,但无论如何我都会认为这是一个错误,并且不希望语言将其静音。如果第二项也是可选的,并且您希望 None 作为最终后备,您也可以使用 .get 进行第二次查找。

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2022-01-17
      • 2021-03-07
      相关资源
      最近更新 更多