如果错误的参数数量传入** args,会引发什么异常?

时间:2009-12-26 19:23:38

标签: python exception

假设在python中你有一个接受三个命名参数的例程(如** args),但必须填写这三个中的任何两个。如果只填写了一个,那就是错误。如果这三个都是,那就是错误。你会提出什么样的错误? RuntimeError,一个专门创建的异常,还是其他?

6 个答案:

答案 0 :(得分:14)

请记住,您可以继承Python的内置异常类(并且TypeError肯定会是正确的内置异常类 - 如果参数的数量与签名不匹配,那就是Python引发的,在签名中没有*a**k表格的正常情况下。我喜欢让每个包定义自己的class Error(Exception),然后根据需要的特定异常可以适当地多次继承,例如:

class WrongNumberOfArguments(thispackage.Error, TypeError):

然后,当我发现这样的问题时,我raise WrongNumberOfArguments

这样,任何知道这个包的调用者都可以捕获thispackage.Error,如果他们需要处理特定于包的任何错误,而其他调用者(可能在调用链中更高)调用仍然会捕获更通用的TypeError来处理任何错误,例如“函数调用中使用的参数数量错误”。

答案 1 :(得分:12)

为什么不做python的工作呢?

>>> abs(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (3 given)

答案 2 :(得分:4)

如果(正如您在其中一条评论中所说)这是程序员错误,那么您可以引发AssertionError:

def two(**kwargs):
    assert len(kwargs) == 2, "Please only provide two args"
顺便说一句,如果你只有三个命名参数,** kwargs似乎是一种奇怪的方法。更自然的可能是:

def two(a=None, b=None, c=None):
    pass

答案 3 :(得分:3)

我会做一个特定的。您可以捕获它并处理该特定异常,因为它是您创建的特殊情况:)

答案 4 :(得分:0)

我会使用ValueError或其子类:“当内置操作或函数接收到具有正确类型但不适当值的参数时引发,并且情况不会被更精确的异常描述,例如IndexError“。

如果您认为所有参数都是单个元组,那么在需要2个时,传递3个或1个值在技术上是不合适的值...至少在我看来! :)

答案 5 :(得分:0)

我建议使用自定义异常。像这样:

class NeedExactlyTwo(ValueError):
    pass

然后您可以在代码中raise NeedExactlyTwo

请务必在您的函数的docstring中记录此内容。