最近我发现自己在我的一些功能中使用了以下习语:
[...]
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成语;具体来说,我怎么能“有条件地回归”?
答案 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