python中缺失值的标准例外是啥?
Posted
技术标签:
【中文标题】python中缺失值的标准例外是啥?【英文标题】:What is the standard exception for a missing value in python?python中缺失值的标准例外是什么? 【发布时间】:2020-04-08 11:57:01 【问题描述】:在缺少正确执行函数的值的情况下,应该使用哪个标准 Python 异常(如果有)? TypeError
和 ValueError
对我来说似乎是不错的候选人,但根据文档(我的斜体):
传递错误类型的参数(例如,当需要
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中缺失值的标准例外是啥?的主要内容,如果未能解决你的问题,请参考以下文章