【问题标题】:Cleanest way of choosing between two values in Python在 Python 中选择两个值的最简洁方法
【发布时间】:2011-03-21 21:17:17
【问题描述】:

Python 中的字典有一个非常好的方法get:

# m is some dict
m.get(k,v) # if m[k] exists, returns that, otherwise returns v 

有什么方法可以为任何价值做到这一点吗?例如,在 Perl 中我可以这样做:

return $some_var or "some_var doesn't exist."

【问题讨论】:

  • 我的错误,由于某种原因,这对我的班级不起作用。投票结束,回想起来这似乎很明显。
  • 作为答案说明,您可以在 Python 中像这样使用 or 运算符。但我很好奇:人们通常认为这个成语 Pythonic 吗?我个人没有在 Python 代码中看到它,但我在 Perl 代码中到处都能看到它。
  • return 声明并没有按照您的想法执行。见stackoverflow.com/questions/1512547/…
  • 您的 Perl 代码错误。 “或”的优先级较低。它将最终等同于return($some_var) or "some_var doesn't exist"。因此,您想要:return $some_var || "some_var doesn't exist" 或从 Perl 5.10 开始使用定义或:return $some_var // "some_var doesn't exist"。当然,您总是可以使用括号使事情更清楚:return($some_var // "some_var doesn't exist")

标签: python perl coding-style


【解决方案1】:

Python 中的or 运算符是guaranteed 以返回其操作数之一,如果左侧表达式计算为False,则计算并返回右侧表达式。

编辑

重新阅读您的问题后,我注意到我第一次误解了它。通过使用locals() 内置函数,您可以将get() 方法用于变量,就像您将它用于dicts(虽然它既不是很漂亮也不是pythonic)来检查值是否存在:

>>> locals().get('some_var', "some_var doesn't exist.")
"some_var doesn't exist."
>>> some_var = 0
>>> locals().get('some_var', "some_var doesn't exist.")
0

【讨论】:

    【解决方案2】:

    其实Python ehre 是有区别的: 如果未定义名为 some_var 的变量,则无法访问它以知道它不存在 - 你会得到一个 NameError 异常。

    这是设计使然:未定义的变量名称没有“未定义”或“空”值,它们会引发异常,这是 Python 与大多数动态类型语言的最大区别之一。

    因此,到达可能或未定义 some_var 的语句不是 Pythonic。在一个好的程序中,即使包含“None”或“False”,它也会被定义 - 在这种情况下,“或”习语会起作用,但推荐的处理方法是使用表达式if,例如:

    return some_var if some_var else "some_var contains a False Value"
    

    如果您碰巧有可能未定义 some_var 的代码,并且无法随时更改它,您可以检查字符串“some_var”是否作为键存在于本地变量字典中,由 locals() 返回知道它是否被定义:

    return some_var if "some_var" in locals() else "some_var was not defined"
    

    这也不是最 Python 的方式 - 必须处理我未定义的变量在 Python 代码中是例外的。所以最好的做法是尝试在 try 原因中使用 vars 内容,如果 var 不存在,则捕获“NameError”异常:

    try:
      return some_var
    except NameError:
      return "some_var not defined"
    

    【讨论】:

      【解决方案3】:

      如果您需要能够更具体地处理“虚假”值(例如,0'' 是很好的值,但 NoneFalse 不是),则需要更详细的“ Python 2.5 中引入的条件表达式(又称三元运算符):

      return x if <cond> else y
      

      &lt;cond&gt; 可以是任何条件:

      return x if isinstance(x, basestring) else y
      

      【讨论】:

        【解决方案4】:

        短路也适用于 Python。

        return a or b
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-26
          • 1970-01-01
          • 2017-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-23
          • 1970-01-01
          相关资源
          最近更新 更多