我正在研究验证功能。我理解异常用于错误和意外情况,但在验证函数的情况下,如果内部不满足条件,我希望它返回False
而不是异常。
事情是,在验证完成后,我需要使用如下消息来引发消息窗口:"Tool exited because X condition not met"
。我的工作流程是返回带有结果和消息的元组:
(True, Y_message)
或 (假,X_condition_not_met)
然后:
a, b = result
if not a:
raise_window(message=b)
然而,最近我偶然发现多个答案引发了关于这个问题的争议,我很困惑。例如,有些人说要始终使用例外情况:What's the best way to return multiple values from a function in Python?而其他人说元组是走的路Best practice in python for return value on error vs. success。
如果有人能指出我正确的方向,我将不胜感激。
答案 0 :(得分:9)
当验证时,您的功能的目的是告诉您是否符合条件。你希望得到一个布尔结果; 有效或无效。例如,如果不支持函数的输入,或者未满足验证过程本身的某些依赖性,则只会抛出错误。在这种情况下,验证程序的正常操作无法完成,在这种情况下您无法返回有效或无效,因为验证程序无法做出该确定
您可以将其与isinstance()
或issubclass()
进行比较;这两个函数测试另一个值的值。他们返回True
或False
,如果您提供不受支持的输入,则会引发异常:
>>> isinstance(1, int)
True
>>> isinstance(1, 'foobar')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
正常操作是验证,为其提供不受支持的输入意味着不能返回有效或无效值,因此可以保证例外。
因此,对于返回(True, message)
或(False, message)
元组的验证程序,我只会在验证过程本身出现问题时引发异常,而不是指示{ {1}}案例。
请注意,验证器返回的内容并不重要;如果你需要返回有效的 / 无效标志和相应的消息(并且只有验证器可以产生该消息),那么返回一个元组就可以了。
您也可以返回自定义类:
(False, message)
然后将其用作测试:
class ValidationResult(object):
def __init__(self, result, message=''):
self.result = bool(result)
self.message = message
def __nonzero__(self): # Python 2
return self.result
__bool__ = __nonzero__ # Python 3
def __str__(self):
return self.message
答案 1 :(得分:-2)
使用异常来指示无效数据是解决此问题的惯用的,规范的Python解决方案。考虑int()
函数,如果传递无效数据,则会发生异常:
>>>> int('abc')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'