Какое исключение следует создать, если неправильное количество аргументов передано в * * 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 для своей функции.