在Python中选择两个值之间最干净的方法

时间:2010-07-27 22:40:39

标签: python perl coding-style

Python中的Dicts有一个非常好的方法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."

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

如果您需要能够更具体地处理“false-ish”值(例如,0''是好的值,但NoneFalse是没有),Python 2.5中引入了更详细的“条件表达式”(又名三元运算符):

return x if <cond> else y

<cond>可以是任何条件:

return x if isinstance(x, basestring) else y

答案 2 :(得分:1)

在Python中也可以短路工作。

return a or b

答案 3 :(得分:1)

实际上Python ehre有所不同: 如果未定义名为some_var的变量,则无法访问它以确定它不存在 - 你会得到一个NameError异常。

设计是这样的:未定义的变量名称没有“未定义”或“空”值,它们引发了异常,这是从Python到大多数动态类型语言的差异之一。

因此,获取some_var可能定义或不定义的语句不是Pythonic。在一个好的程序中,它将被定义,即使包含“无”或“假” - 在这种情况下,“或”成语会起作用,但建议的方法是使用表达式if,如:

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

如果您碰巧有可能未定义some_var的代码,并且不能为soemr eason更改它,则可以检查字符串“some_var”是否作为localv ariables的一个关键字存在,由{返回{1}}要知道它是否被定义:

locals()

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

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