Ś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).
Warto zauważyć, że składnia forraise zmieniła się nieco w Pythonie 3. Część, która dotyczy tego pytania, jest jednak taka sama ( raise ExceptionTypenadal tworzy instancję typu przez wywołanie konstruktora bez argumentów).
Blckknght
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()'
Odpowiedzi:
Krótka odpowiedź brzmi: jedno
raise MyException
i drugieraise 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 MyException
gdy nie ma argumentów. Ludzie tworzą wyjątek bezpośrednio tylko wtedy, gdy trzeba przekazać jakieś argumenty. Na przykład:raise KeyError(badkey)
.źródło
Zajrzyj do dokumentacji dotyczącej
raise
oświadczenia . Tworzy instancjęMyException
.źródło
raise
zmieniła się nieco w Pythonie 3. Część, która dotyczy tego pytania, jest jednak taka sama (raise ExceptionType
nadal tworzy instancję typu przez wywołanie konstruktora bez argumentów).Tak, jest różnica między
ValueError
iValueError()
ValueError
jest klasą, podczas gdyValueError()
tworzy instancję klasy. To jest powód, dla któregotype(ValueError) is type
itype(ValueError()) is ValueError
Jedynym celem
raise
jest zgłoszenie wyjątku,Uwaga:
raise ValueError # shorthand for 'raise ValueError()'
źródło