验证和异常与错误消息元组

chr*_*oup 1 python tuples exception

我正在研究验证功能.我理解异常用于错误和意外情况,但在验证函数的情况下,如果内部不满足条件,我希望它返回False而不是异常.

问题是在验证结束后,我需要用以下消息引发一个消息窗口:"Tool exited because X condition not met".我的工作流程是返回带有结果和消息的元组:

(True, Y_message)
Run Code Online (Sandbox Code Playgroud)

或(假,X_condition_not_met)

然后:

a, b = result
if not a:
    raise_window(message=b)
Run Code Online (Sandbox Code Playgroud)

然而,最近我偶然发现多个答案引发了关于这个问题的争议,我很困惑.例如,有些人说要总是使用异常:从Python中的函数返回多个值的最佳方法是什么?和其他人说元组是最好的方法在python中获得错误与成功的返回值.

如果有人能指出我正确的方向,我将不胜感激.

Mar*_*ers 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
Run Code Online (Sandbox Code Playgroud)

正常操作是验证,给它不支持的输入意味着不能返回有效无效的值,因此保证例外.

因此,对于返回一个(True, message)或一个(False, message)元组的验证器,如果验证过程本身存在问题,我只会引发异常,而不是表明(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
Run Code Online (Sandbox Code Playgroud)

然后用它作为测试:

valid = validation(value)
if not valid:
    raise_window(message=str(valid))
Run Code Online (Sandbox Code Playgroud)