Какое исключение следует вызывать для неизвестных аргументов ключевого слова? - PullRequest
1 голос
/ 01 апреля 2020

В Python, какое исключение следует вызывать при передаче неизвестного ключевого аргумента в функцию? Должно ли это быть SyntaxError? Я видел, что Python само поднимает TypeError, но я не уверен почему.

Например:

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

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Подходящая ошибка для неожиданных или отсутствующих аргументов: 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 семантически использует общий модель типа функции , в которой тип функции является ее сигнатурой, т.е. Parameters -> Result. Например, функция

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

имеет тип (a: Any, b: Any) -> Any. Что касается типов, он может быть заменен любой другой функцией той же сигнатуры. Это кодируется дополнительной опцией Python stati c типа .

Вызов функции означает предоставление соответствия Parameters. При этом используются правила Python для сопоставления аргументов с параметрами, например, add(b=3, a=1) по-прежнему соответствует add(a: Any, b: Any).

Вызов с несовместимой подписью, например, add(1, 2, 3), означает функцию different * На сайте вызова ожидается тип 1025 *, например, (:Any, :Any, :Any) -> Any в этом случае. Это означает, что тип / подпись вызова и функции не совпадают. Таким образом, TypeError является подходящим.

1 голос
/ 01 апреля 2020

Вероятно, было бы наиболее целесообразно сделать то же самое, что и сам 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'

A TypeError также вызывается, если вы даете больше позиционных аргументов, чем поддерживает функция, что также указывает на то, что TypeError описывает этот тип ошибки наилучшим образом (и это то, что вы ожидаете от самого Python).

Raised когда операция или функция применяется к объекту неподходящего типа. Связанное значение представляет собой строку, содержащую сведения о несоответствии типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...