Какое исключение поднять, если неверное количество аргументов передано ** аргументам? - PullRequest
10 голосов
/ 26 декабря 2009

Предположим, в python у вас есть подпрограмма, которая принимает три именованных параметра (как ** аргументы), но любые два из этих трех должны быть заполнены. Если заполнен только один, это ошибка. Если все три, это ошибка. Какую ошибку вы бы подняли? RuntimeError, специально созданное исключение или другое?

Ответы [ 6 ]

14 голосов
/ 26 декабря 2009

Помните, что вы можете создавать подклассы встроенных классов исключений в Python (и TypeError, безусловно, будет правильным встроенным классом исключений, который нужно поднять здесь - это то, что вызывает Python, если число аргументов не соответствует сигнатуре, в нормальные случаи без *a или **k форм в подписи). Мне нравится, когда каждый пакет определяет свой собственный class Error(Exception), и тогда конкретные исключения по мере необходимости могут умножаться наследовать по мере необходимости, например ::

class WrongNumberOfArguments(thispackage.Error, TypeError):

Тогда я бы raise WrongNumberOfArguments обнаружил бы такую ​​проблемную ситуацию.

Таким образом, любой вызывающий абонент, который знает об этом пакете, может перехватить thispackage.Error, если ему необходимо устранить какую-либо ошибку, специфичную для пакета, в то время как другие вызывающие (предположительно выше в цепочке вызовов) вызовы все еще перехватывают более общий TypeError для устранения любых ошибок, таких как «неправильное количество аргументов, используемых в вызове функции».

12 голосов
/ 26 декабря 2009

Почему бы просто не сделать то, что делает Python?

>>> abs(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (3 given)
4 голосов
/ 26 декабря 2009

Если (как вы говорите в одном из комментариев), что это ошибка программиста, вы можете вызвать AssertionError:

def two(**kwargs):
    assert len(kwargs) == 2, "Please only provide two args"

Кстати, если у вас есть только три именованных аргумента, ** kwargs кажется странным способом сделать это. Более естественным может быть:

def two(a=None, b=None, c=None):
    pass
3 голосов
/ 26 декабря 2009

Я бы сделал конкретный. Вы можете поймать его и разобраться с этим конкретным исключением, поскольку это особое обстоятельство, которое вы создали

0 голосов
/ 26 декабря 2009

Я рекомендую пользовательское исключение. Вот так:

class NeedExactlyTwo(ValueError):
    pass

Тогда вы можете raise NeedExactlyTwo в своем коде.

Обязательно запишите это в строку документации для вашей функции.

0 голосов
/ 26 декабря 2009

Я бы использовал ValueError или его подкласс: «Возникает, когда встроенная операция или функция получает аргумент, имеющий правильный тип, но неуместное значение, и ситуация не описывается более точным исключением, таким как IndexError. "

Передача 3 или 1 значений, когда требуется ровно 2, будет технически неприемлемой, если вы считаете все аргументы одним кортежем ... По крайней мере, на мой взгляд! :)

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