对于未知关键字参数,应引发哪个异常?

2024-04-19 19:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,将未知关键字参数传递给函数时应引发哪个异常?应该是^{}吗?我看到Python本身引发了^{},但我不知道为什么

例如:

def add(**kwargs):
    a = kwargs.pop('a', 0.)
    b = kwargs.pop('b', 0.)

    if kwargs:
        # what to raise here?
        raise SyntaxError('Unknown keyword arguments: ' + list(kwargs.keys()))
        # or ? 
        # raise TypeError('Unknown keyword arguments: ' + list(kwargs.keys()))

    return a + b

Tags: 函数addifdef关键字keyspoparguments
2条回答

它可能最适合做与Python本身相同的事情,即它引发了一个TypeError异常:

>>> def f(a, b):
...   pass
...
>>> f(a=1, b=2, c=3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got an unexpected keyword argument 'c'

如果给出的位置参数多于函数所支持的参数,则也会引发TypeError,这也表明TypeError对此类错误的描述最好(这也是您对Python本身的期望)

Raised when an operation or function is applied to an object of inappropriate type. The associated value is a string giving details about the type mismatch.

意外或缺少参数的相应错误为TypeError

>>> def add(a, b=0.): ...
>>> add(a=3, c=5)
TypeError: add() got an unexpected keyword argument 'c'
>>> add(1, 2, 3)
TypeError: add() takes from 1 to 2 positional arguments but 3 were given
>>> add()
TypeError: add() missing 1 required positional argument: 'a'

虽然函数的具体类型只是function,但Python在语义上使用公共的function type model,其中函数的类型是它的签名,即Parameters -> Result。例如,函数

def add(a, b): return a + b

具有类型(a: Any, b: Any) -> Any。就类型而言,它可以与具有相同签名的任何其他函数交换。这也是由Python的可选static type support编码的

调用函数意味着提供匹配的Parameters。这使用Python的规则将参数匹配到参数,例如add(b=3, a=1)仍然匹配add(a: Any, b: Any)

带有不兼容签名的调用,例如add(1, 2, 3),意味着在调用站点上需要不同类型的函数,例如(:Any, :Any, :Any) -> Any。这意味着调用的类型/签名与函数不匹配。因此,TypeError是合适的

相关问题 更多 >