python中缺失值的标准例外是啥?

Posted

技术标签:

【中文标题】python中缺失值的标准例外是啥?【英文标题】:What is the standard exception for a missing value in python?python中缺失值的标准例外是什么? 【发布时间】:2020-04-08 11:57:01 【问题描述】:

在缺少正确执行函数的值的情况下,应该使用哪个标准 Python 异常(如果有)? TypeErrorValueError 对我来说似乎是不错的候选人,但根据文档(我的斜体):

传递错误类型的参数(例如,当需要int 时传递list)应该会导致TypeError,但是传递具有错误值的参数(例如,超出预期边界的数字)会导致ValueError

ValueError :当操作或函数接收到具有正确类型但值不适当的参数时引发,并且这种情况没有通过更精确的异常来描述,例如作为索引错误。

在我看来,这些描述都没有完全捕捉到缺失值的概念。但标准中的其他例外似乎也没有一个更接近。

这是一个例子。 myclass 类型的对象可以用两种不同的方式实例化,每种方式都需要一个特定的参数。如果两者都没有提供,则初始化失败。

class myclass(object):
    def __init__(self,firstparam=None,secondparam=None):
        if firstparam:
             self.firstinit()
        elif secondparam:
             self.secondinit()
        else:
           #What to put here ?
           raise Exception("Missing value for myclass")

if __name__=="__main__":
    #oops, forgot to specify a parameter here !
    myobj=myclass()
    

当然,我知道在编写库时我总是可以实现自己的MissingValueError 异常子类。我问这个问题是为了不重复标准中可能已经存在的东西。

【问题讨论】:

我不认为 Python 标准异常具体涵盖了这种情况,因为它是一个非常特定于场景的情况。如果我是你,我会创建自己的异常以在构造对象时抛出,或者坚持使用通用的 Exception 类。 @dddJewelsbbb 真的是这样的场景特定情况吗?我给出的例子当然非常具体,但是缺失值的概念似乎适用于各种情况。 @DanD。我认为这是对 valueerror 的滥用。 docs.python.org/3/library/exceptions.html#ValueError 明确指出它适用于“正确类型”的值。您无法检查缺失值的类型。 为了清楚起见,我对两者的区别在于,当您提供多个默认参数,并且您正在检查至少一个是非 Falsy 或至少不是默认参数时,你的例外不是你提供了错误的类型,而是你没有得到至少一种足够的类型,我认为这是两者之间非常微妙但有效的区别使得这是一个“特定场景”。 不过想了想,这大概是一个角度的问题吧。如果我们担心抛出“正确的”异常,我仍然认为这应该是一个自定义异常,但如果您必须冒泡一个特定的 Python 异常,我会支持@lenik最合适的应该是TypeError,只要你不期望一个虚假的值。 【参考方案1】:

正确的例外是TypeError:

>>> def a(b,c) : print b,c
... 
>>> a(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a() takes exactly 2 arguments (1 given)
>>> 

作为旁注,我建议不要为所需的参数提供默认值,这样你班级的用户就会清楚地理解他必须提供一些。

【讨论】:

如果两个参数都需要,这是一个很好的解决方案,但在我的示例中,我只需要一个或另一个。 @Typhon 当我打电话给MyClass(42) -- 42 是第一个参数还是第二个? =) 它肯定不是定义的关键字参数之一。【参考方案2】:

您也可以有自己的自定义验证异常。

类似这样的:


class ValidationError(Exception):
    def __init__(self, msg):
        self.msg = msg


class MyClass(object):
    def __init__(self, firstparam=None, secondparam=None):
        if firstparam:
            self.firstinit()
        elif secondparam:
            self.secondinit()
        else:
            # What to put here ?
            raise ValidationError("Either firstparam or secondparam should be passed")

    def firstinit(self):
        pass

    def secondinit(self):
        pass


if __name__ == "__main__":
    #oops, forgot to specify a parameter here !
    try:
        myobj=MyClass()
    except ValidationError as err:
        print(err)

输出:

Either firstparam or secondparam should be passed

【讨论】:

我知道我可以创建一个自定义异常,这个问题的目的是询问标准库中是否已经存在针对此类问题的异常。

以上是关于python中缺失值的标准例外是啥?的主要内容,如果未能解决你的问题,请参考以下文章

spss16.0缺失值是啥意思

Python,Pandas:只返回那些有缺失值的行

Python3 DataFrame缺失值的处理

Python3 DataFrame缺失值的处理

Python 中处理缺失值的 2 种方法

机器学习基础:缺失值的处理技巧(附Python代码)