2010-07-27 83 views
3

类型的字典方式有一个非常好的方法get最干净的Python在Python两个值之间选择

# 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." 
+0

我的错误,这是不工作的我的类一些原因。投票结束后,这在回顾过程中显得很明显。 – 2010-07-27 22:48:31

+0

作为答案的提示,你可以在Python中使用像这样的运算符。但我很好奇:人们通常会认为这个成语Pythonic?我没有亲眼见过它在Python代码中,但我在各地的Perl代码中看到它。 – 2010-07-27 22:48:39

+5

'return'声明不会做你认为它做的事。请参阅http://stackoverflow.com/questions/1512547/what-is-the-difference-between-perls-or-and-and-short-circuit-op – mob 2010-07-27 22:48:45

回答

2

or运营商在Python是guaranteed返回其操作数中的一个,如果左边表达式的计算结果为False,正确的评估和返回。

编辑:重新阅读您的问题

后,我发现我误会了它的第一次。通过使用locals()内置的功能,您可以使用变量get()方法,就像你使用它的类型的字典(虽然它既不非常漂亮,也没有Python的),检查一个值是否存在:

>>> 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

短路也可以在Python中工作。

return a or b 
2

如果你需要能够处理“假十岁上下的”值更具体的(例如,0''是良好的价值观,但NoneFalse都没有),还有的更详细的“条件表达式”(又名三元操作者)在Python 2.5介绍:

return x if <cond> else y 

其中<cond>可以是任何条件:

return x if isinstance(x, basestring) else y 
1

实际上Python ehre有所不同: 如果没有定义名为some_var的变量,则无法访问它以知道它不存在 - 您将收到NameError异常。

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

所以,Pythonic并不是一个声明,可以定义或不定义some_var。在一个好的程序中,它将被定义,即使包含“无”或“假” - 在这种情况下,“或”成语将起作用,但推荐的方式是使用表达式if

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

如果你碰巧有机会上那里some_var可能不被定义的代码,而不能用于soemr陈奕迅改变这种状况,你可以检查字符串“some_var”的存在为localv ariables的dicitonary的关键,通过locals()返回知道它是否被定义:

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

那不是最Python的方式要么 - 必须处理变量,我没有定义是Python例外的例外。所以最好的初步实践。将尝试使用try事业里面的瓦尔内容,赶上“NameError”异常,如果该变种不存在:

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