Есть ли разница между "raise exception()" и "raise exception" без скобок?
Определение исключения без параметров:
class MyException(Exception):
pass
Есть ли разница между:
?
raise MyException
и
raise MyException()
Я не смог найти ни одного; это просто перегруженный синтаксис?
Ответ 1
Короткий ответ заключается в том, что оба raise MyException и raise MyException() делают то же самое. Эта первая форма автоматически создает ваше исключение.
соответствующий раздел из документов говорит: "raise оценивает первое выражение как объект исключения. Он должен быть либо подклассом, либо экземпляром BaseException. является классом, экземпляр исключения будет получен, когда это необходимо, путем создания экземпляра класса без аргументов."
Тем не менее, хотя семантика одна и та же, первая форма микроскопически быстрее, а вторая форма более гибкая (потому что вы можете передать ее аргументы, если это необходимо).
Обычный стиль, который большинство людей использует в Python (т.е. в стандартной библиотеке, в популярных приложениях и во многих книгах), использует raise MyException, когда нет аргументов. Люди просто создают исключение непосредственно, когда необходимо передать некоторые аргументы. Например: raise KeyError(badkey).