Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回if值惯用法(条件返回)_Python_Idioms - Fatal编程技术网

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语句)