Czy istnieje różnica między „podnieś wyjątek ()” a „zgłoś wyjątek” bez nawiasów?


100

Definiowanie bezparametrowego wyjątku:

class MyException(Exception):
    pass

Czy po podniesieniu jest jakaś różnica między:

raise MyException

i

raise MyException()

Nie mogłem znaleźć żadnego; czy to po prostu przeładowana składnia?


1
Przeczytaj tę odpowiedź: stackoverflow.com/questions/13052991/…
satoru

1
Ściśle mówiąc, nie jest to składniowe. Python nie może wiedzieć, czy otrzyma klasę czy instancję do czasu uruchomienia.
asmeurer

Odpowiedzi:


116

Krótka odpowiedź brzmi: jedno raise MyExceptioni drugie raise MyException()robi to samo. Ta pierwsza forma automatycznie tworzy instancję wyjątku.

Istotne odcinek od docs mówi, " podbicie ocenia pierwsze wyrażenie jako obiekt wyjątku. To musi być podklasą lub instancją BaseException. Jeśli jest to klasa, wystąpienie wyjątku zostaną uzyskane, gdy są potrzebne przez instancję klasy z bez argumentów. "

To powiedziawszy, mimo że semantyka jest taka sama, pierwsza forma jest mikroskopijnie szybsza, a druga forma jest bardziej elastyczna (ponieważ w razie potrzeby można przekazać jej argumenty).

Typowy styl, którego większość ludzi używa w Pythonie (tj. W bibliotece standardowej, w popularnych aplikacjach i wielu książkach) jest używany, raise MyExceptiongdy nie ma argumentów. Ludzie tworzą wyjątek bezpośrednio tylko wtedy, gdy trzeba przekazać jakieś argumenty. Na przykład: raise KeyError(badkey).


18
Dlaczego pierwsza forma (bez nawiasów) miałaby być mikroskopijnie szybsza?
jamesdlin

15
@jamesdlin Ponieważ kod C do automatycznego tworzenia instancji nie ma zinterpretowanego narzutu niż pochodzi z tego, że sam wykonujesz połączenie.
Raymond Hettinger


0

Tak, jest różnica między ValueErroriValueError()

ValueErrorjest klasą, podczas gdy ValueError()tworzy instancję klasy. To jest powód, dla którego type(ValueError) is typeitype(ValueError()) is ValueError

Jedynym celem raisejest zgłoszenie wyjątku,

kiedy użyjemy ValueError, zostanie wywołana klasa, która z kolei uruchomi konstruktor ValueError()

kiedy używamy ValueError(), metoda ValueError()jest wywoływana bezpośrednio.

Uwaga: raise ValueError # shorthand for 'raise ValueError()'

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.