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语法有点笨拙且不合Python,而且我并不总是能够做类似的事情

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

因为有时我的验证函数包含一些计算量相当大的逻辑。

那么,StackOverflow,对于这类问题存在哪些 Python 习语;具体来说,我还能如何“有条件地返回”?

4

4 回答 4

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
于 2013-02-08T15:40:39.347 回答
1

你可以做

def ifloop(x):
    if x: yield x

for ret in ifloop(self.validate()):
     return ret
于 2013-02-08T15:36:43.260 回答
0

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

def __nonzero__(self) :
    return False

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

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

于 2013-02-08T17:23:42.650 回答
0

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

return self.validate() or None
于 2013-02-08T15:44:33.297 回答