Подтвердить что ты не робот

Есть ли разница между "raise exception()" и "raise exception" без скобок?

Определение исключения без параметров:

class MyException(Exception):
    pass

Есть ли разница между:

?
raise MyException

и

raise MyException()

Я не смог найти ни одного; это просто перегруженный синтаксис?

4b9b3361

Ответ 1

Короткий ответ заключается в том, что оба raise MyException и raise MyException() делают то же самое. Эта первая форма автоматически создает ваше исключение.

соответствующий раздел из документов говорит: "raise оценивает первое выражение как объект исключения. Он должен быть либо подклассом, либо экземпляром BaseException. является классом, экземпляр исключения будет получен, когда это необходимо, путем создания экземпляра класса без аргументов."

Тем не менее, хотя семантика одна и та же, первая форма микроскопически быстрее, а вторая форма более гибкая (потому что вы можете передать ее аргументы, если это необходимо).

Обычный стиль, который большинство людей использует в Python (т.е. в стандартной библиотеке, в популярных приложениях и во многих книгах), использует raise MyException, когда нет аргументов. Люди просто создают исключение непосредственно, когда необходимо передать некоторые аргументы. Например: raise KeyError(badkey).

Ответ 3

Да, есть разница между ValueError и ValueError()

ValueError - это класс, тогда как ValueError() создает экземпляр класса. По этой причине type(ValueError) is type а type(ValueError()) is ValueError

Единственная цель raise - поднять исключение,

когда мы используем ValueError, будет вызван класс, который в свою очередь запускает конструктор ValueError()

когда мы используем ValueError(), метод ValueError() вызывается напрямую.

Примечание: raise ValueError # shorthand for 'raise ValueError()'