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

Python 如果传入**kwargs的参数数量错误,则会引发什么异常?,python,exception,Python,Exception,假设在python中有一个例程接受三个命名参数(如**kwargs),但必须填写这三个参数中的任意两个。如果只填了一个,那就是一个错误。如果这三个都是,那就是一个错误。你会犯什么样的错误?运行时错误、专门创建的异常或其他?我会创建一个专门的异常。您可以捕获它并处理该特定异常,因为这是您创建的特殊情况:)如果(正如您在其中一条评论中所说)这是一个程序员错误,那么您可以提出断言错误: def two(**kwargs): assert len(kwargs) == 2, "Please on

假设在python中有一个例程接受三个命名参数(如**kwargs),但必须填写这三个参数中的任意两个。如果只填了一个,那就是一个错误。如果这三个都是,那就是一个错误。你会犯什么样的错误?运行时错误、专门创建的异常或其他?

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

如果(正如您在其中一条评论中所说)这是一个程序员错误,那么您可以提出断言错误:

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

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

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


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

为什么不像python那样做呢

>>> abs(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (3 given)
abs(1,2,3) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:abs()只接受一个参数(给定3个)
我建议使用自定义异常。像这样:

class NeedExactlyTwo(ValueError):
    pass
然后,您可以在代码中精确地提高两个


请确保在函数的docstring中记录这一点。

请记住,您可以对Python的内置异常类进行子类化(而且
TypeError
肯定是这里要提出的正确的内置异常类——如果参数的数量与签名不匹配,Python就会提出这个异常类,在正常情况下,签名中没有
*a
**k
表单)。我喜欢让每个包定义自己的
类错误(异常)
,然后根据需要,可以根据需要使用特定的异常,例如:

class WrongNumberOfArguments(thispackage.Error, TypeError):
然后,当我发现这样的问题时,我会
提出错误的numberOfArguments


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

这是一个很好地使用多重继承的示例。谢谢。