Какое исключение следует создать, если неправильное количество аргументов передано в * * args?

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

6 ответов


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

class WrongNumberOfArguments(thispackage.Error, TypeError):

потом raise WrongNumberOfArguments когда Я обнаруживаю такую проблемную ситуацию.

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


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

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

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

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, технически будет неприемлемым значением, если вы считаете все аргументы одним кортежем... По крайней мере на мой взгляд! :)


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

class NeedExactlyTwo(ValueError):
    pass

тут вы можете raise NeedExactlyTwo в коде.

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