Python 返回if值惯用法(条件返回)
最近,我发现自己在一些函数中使用了以下习惯用法:Python 返回if值惯用法(条件返回),python,idioms,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:
[...]
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习惯用法;具体来说,我还可以如何“有条件地返回”?您可以这样做
def ifloop(x):
if x: yield x
for ret in ifloop(self.validate()):
return ret
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
如果代码在您的
If
之后不需要继续,我会写:
return self.validate() or None
您可以使用,确保添加以下方法,这样它的实例也将被视为False,这将使测试更容易:
def __nonzero__(self) :
return False
此类Null
对象的用处在于,它们几乎可以像任何其他对象一样使用,因此在许多情况下,您不必在代码的其余部分检查它们,因为您可以假定它具有其他类型的有效对象
我第一次听到这个模式是在亚历克斯·马泰利的《第二版》中。这是食谱我必须同意,它完全没有音律,因为我实际上不明白你想做什么。。。如果很难解释,这是一个坏主意:如果数据无效,PMy“validation”函数将返回False。如果数据有效,我希望尽早退出调用函数(调用self.validate()的函数);如果不是,我想继续执行流程。嗯,这里的语义似乎有点错误:
self.validate()
意味着您要确保当前(!)对象,即self
有效。是的,你是对的——这就是我的代码所做的——但是我可能有点过度疲劳,在表达自己方面做得很差。方法的名称显然是错误的。如果对象有效,我希望validate
返回True
,否则返回False
。我想我应该先使用if块;-)。但有趣的是,巧妙地使用了生成器函数;这些就是我在寻找的答案;)这是运行时的namererror
。仅限于“y未定义”;出于同样的原因,我最初提出的问题的代码片段也会namererror
。不过,这与答案的要点非常相切。一个例外是我完全忘记的事情;谢谢我喜欢这样,即使非python程序可能会感到困惑;我希望非True的情况继续执行(即永远不会触发return语句)