Правильное исключение для повышения, если None встречается как аргумент
Что такое "правильный" класс исключения для повышения, когда одна из моих функций обнаруживает None
, переданную там, где требуется значение аргумента? Например:
def MyFunction(MyArg1, MyArg2):
if not MyArg2:
raise ?Error?
Я думаю, что видел здесь TypeError
(и это правда, что я получаю NoneType
, где ожидается какой-то другой тип), но это не кажется мне совершенно правильным для этой ситуации, когда я думаю Исключение может быть более явным.
Ответы
Ответ 1
В Python отсутствует встроенное исключение "invalid argument" или "null pointer". Вместо этого большинство функций повышают TypeError
(недопустимый тип, такой как NoneType
) или ValueError
(правильный тип, но значение находится за пределами принятого домена).
Если ваша функция требует объекта определенного класса и вместо этого получает None
, она должна, вероятно, поднять TypeError
, как вы указали. В этом случае вы должны явно проверить None
, так как объект правильного типа может оценивать значение boolean False
, если он реализует __nonzero__
/__bool__
:
if MyArg2 is None:
raise TypeError
Документы Python:
Ответ 2
Большая часть функции python вызывает TypeError
, если None
передается как аргумент. Возьмите любую функцию, скажем chr(None)
и посмотрите, что она поднимает TypeError
.
Ответ 3
Как отмечали другие, TypeError
или ValueError
было бы естественным. Если это не кажется достаточно конкретным, вы можете подклассом, какой из двух исключений лучше подходит. Это позволяет согласованно обрабатывать недопустимые аргументы для широкого класса функций, а также дает вам более подробную информацию о конкретной функции.
Ответ 4
Просто используйте assert:
assert type(MyArg2) == int
Или, альтернативно:
assert type(MyArg2) != None
Это не позволит кому-то передать вам неправильный тип, а также решить проблему "Нет". Он вернет AssertionError
, в соответствии с документами.