2013-02-08 75 views
1

最近我发现使用下面的语句在我的一些功能自己:返回,如果值成语(有条件返回)

[...] 
def validate(self): 
    # Possibly do something "expensive" to calculate whether data is valid or not 
    if data_is_valid: 
     return ObjectOfSomeSort(validated_data) 
    return False 

ret = self.validate() 
if ret: 
    return ret 
[...] 

我觉得像ret = ...; if ret: return ret语法有点笨拙,unpythonic,但是,而我并不总是能够做到像

if self.validate(): 
    return self.validate() 

东西,因为偶尔我的验证函数包含一些比较昂贵的计算逻辑。

所以,StackOverflow,这种问题存在什么样的python习语;具体而言,我还能如何“有条件地返回”?

+0

我必须同意,是完全unpythonic,因为我实际上没有得到你想做什么......如果它很难解释,这是一个坏主意:P – KurzedMetal 2013-02-08 15:38:54

+0

我的“验证”函数返回False如果数据无效。如果数据是有效的,我想早日退出调用函数(调用self.validate()的函数);如果不是,我想继续执行流程。 – 2013-02-08 15:40:41

+0

嗯,看起来这里的语义有点不对:'self.validate()'意味着你要确保* current(!)*对象,又名'self'是有效的。 – 2013-02-08 15:41:37

回答

1

你可以做

def ifloop(x): 
    if x: yield x 

for ret in ifloop(self.validate()): 
    return ret 
+0

我想我会采取如果块首先;-)。但有趣的是巧妙地使用发电机功能。 – mgilson 2013-02-08 15:39:36

+0

+1为聪明的发电机;这些都是我正在寻找的答案;) – 2013-02-08 15:41:54

+2

这是运行时的'NameError'。 – Bakuriu 2013-02-08 15:43:49

2

地道的Python是使用一个例外。

class InvalidDataError(Exception): 
     pass 

    def get_valid_object(): 
     if not data_is_valid: 
      raise InvalidDataError() 
     return ObjectOfSomeSort(validated_data) 

然后使用它:

try: 
    valid_object = get_valid_object() 
except InvalidDataError: 
    ... handle error 
+1

一个例外是我完全忘记的;谢谢! – 2013-02-08 15:43:41

0

如果代码不需要你if后继续,我会写:

return self.validate() or None 
+0

我喜欢这样,即使非python程序可能会感到困惑。 – Bakuriu 2013-02-08 15:46:46

+0

这将返回自我。如果self.validate()为非True,则返回None;我希望非True情况继续执行(即从不触发return语句) – 2013-02-08 15:47:06

0

您可以使用NULL object pattern ,确保添加以下方法,因此它的实例也将被视为False - 这将使测试更容易:

def __nonzero__(self) : 
    return False 

这样Null对象的用处在于它们可以像几乎任何其他对象使用,因此在很多情况下,你就不会在你的代码的其余部分,可以假定它来检查他们自己拿到的有效对象一些其他类型。

我第一次听到Alex Martelli在Python Cookbook的第二版中的这种模式。这是配方6.17