Чи є різниця між "підвищити виключення ()" і "підвищити виняток" без дужок?


99

Визначення виключення без параметрів:

class MyException(Exception):
    pass

Чи є різниця між:

raise MyException

і

raise MyException()

Я не міг знайти жодного; це просто перевантажений синтаксис?


1
Прочитайте цю відповідь: stackoverflow.com/questions/13052991 / ...
Сатору

1
Строго кажучи, це не синтаксично. Python не може знати, чи отримає він клас або екземпляр до часу виконання.
asmeurer

Відповіді:


114

Коротка відповідь , що обидва raise MyExceptionі raise MyException()зробити те ж саме. Ця перша форма автоматично створює ваш виняток.

Відповідний розділ з документації каже, " підвищення оцінює перший вираз в якості об'єкта виключення. Це повинно бути підкласом або екземпляр BaseException. Якщо це клас, екземпляр виключення буде отримано , коли це необхідно інстанцірованія класу з ніяких аргументів ».

Тим не менш, незважаючи на те, що семантика однакова, перша форма мікроскопічно швидша, а друга форма більш гнучка (оскільки ви можете передавати їй аргументи, якщо це потрібно).

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


18
Чому перша форма (без дужок) була б мікроскопічно швидшою?
jamesdlin

15
@jamesdlin Оскільки код С для автоматичного встановлення не має інтерпретованих накладних витрат, ніж саме ви робите виклик.
Реймонд Хеттінгер

4

Перегляньте документи для raiseтвердження . Це створює екземпляр MyException.


1
Варто зазначити, що синтаксис forraise трохи змінився в Python 3. Частина, що стосується цього питання, однакова, хоча ( raise ExceptionTypeвсе-таки створюється екземпляр типу, викликаючи його конструктор без аргументів).
Blckknght

0

Так, є різниця між ValueErrorіValueError()

ValueErrorє класом, тоді як ValueError()створює екземпляр класу. Це причина type(ValueError) is typeіtype(ValueError()) is ValueError

Єдина мета raise- збільшити виняток,

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

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

Примітка: raise ValueError # shorthand for 'raise ValueError()'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.