类型的字典方式有一个非常好的方法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."
类型的字典方式有一个非常好的方法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."
的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
短路也可以在Python中工作。
return a or b
如果你需要能够处理“假十岁上下的”值更具体的(例如,0
或''
是良好的价值观,但None
和False
都没有),还有的更详细的“条件表达式”(又名三元操作者)在Python 2.5介绍:
return x if <cond> else y
其中<cond>
可以是任何条件:
return x if isinstance(x, basestring) else y
实际上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"
我的错误,这是不工作的我的类一些原因。投票结束后,这在回顾过程中显得很明显。 – 2010-07-27 22:48:31
作为答案的提示,你可以在Python中使用像这样的运算符。但我很好奇:人们通常会认为这个成语Pythonic?我没有亲眼见过它在Python代码中,但我在各地的Perl代码中看到它。 – 2010-07-27 22:48:39
'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