返回价值成语(条件返回)

时间:2013-02-08 15:33:21

标签: python idioms

最近我发现自己在我的一些功能中使用了以下习语:

[...]
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语法有点笨拙且不熟悉,然而,我并不总是能做类似

的事情。
if self.validate():
    return self.validate()

因为偶尔我的验证函数包含一些计算成本较高的逻辑。

所以,StackOverflow,这类问题存在什么python成语;具体来说,我怎么能“有条件地回归”?

4 个答案:

答案 0 :(得分: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 :(得分:1)

你可以做到

def ifloop(x):
    if x: yield x

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

答案 2 :(得分:0)

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

return self.validate() or None

答案 3 :(得分:0)

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

def __nonzero__(self) :
    return False

这些Null对象的用处是它们可以像几乎任何其他对象一样使用,因此在很多情况下,您不必在代码的其余部分中检查它们,这可以假设它有效其他类型的对象。

我首先在Alex Martelli的第二版Python Cookbook中听说过这种模式。这是食谱6.17