“raise exception ()”과“raise exception”사이에 괄호없이 차이가 있습니까?


99

매개 변수없는 예외 정의 :

class MyException(Exception):
    pass

제기되면 다음과 같은 차이점이 있습니까?

raise MyException

raise MyException()

나는 아무것도 찾을 수 없었다. 단순히 오버로드 된 구문입니까?



1
엄밀히 말하면 통사론이 아닙니다. Python은 런타임까지 클래스 또는 인스턴스를 가져올 지 알 수 없습니다.
asmeurer

답변:


114

짧은 대답은 둘이다 raise MyException그리고이 raise MyException()같은 일을. 이 첫 번째 양식은 예외를 자동으로 인스턴스화합니다.

문서관련 섹션에서 " raise 는 첫 번째 표현식을 예외 객체로 평가합니다. 하위 클래스이거나 BaseException 인스턴스 여야합니다. 클래스 인 경우 필요한 경우 예외 인스턴스를 다음으로 인스턴스화하여 얻을 수 있습니다. 인수가 없습니다. "

즉, 의미가 동일하더라도 첫 번째 형식은 미시적으로 더 빠르고 두 번째 형식은 더 유연합니다 (필요한 경우 인수를 전달할 수 있기 때문입니다).

대부분의 사람들이 파이썬 (즉, 표준 라이브러리, 인기있는 응용 프로그램 및 많은 책에서)에서 사용하는 일반적인 스타일 raise MyException은 인수가 없을 때 사용하는 것입니다. 사람들은 일부 인수를 전달해야 할 때만 예외를 직접 인스턴스화합니다. 예 : raise KeyError(badkey).


18
괄호가없는 첫 번째 형식이 현미경 적으로 더 빠른 이유는 무엇입니까?
jamesdlin

15
@jamesdlin 자동 인스턴스화 할 C 코드에는 직접 호출하는 것보다 해석 된 오버 헤드가 없기 때문입니다.
Raymond Hettinger

4

대한 문서를raise 살펴보십시오 . 의 인스턴스를 만들고 MyException있습니다.


1
파이썬 3에서 구문raise 이 약간 변경 되었다는 점 주목할 가치가 있습니다. 이 질문과 관련된 부분은 동일하지만 raise ExceptionType여전히 인수없이 생성자를 호출하여 유형의 인스턴스를 생성합니다.
Blckknght

0

네, ValueError와 사이에 차이가 있습니다.ValueError()

ValueError클래스 ValueError()의 인스턴스를 만드는 반면 클래스입니다. 이것이 type(ValueError) is typetype(ValueError()) is ValueError

의 유일한 목적은 raise예외를 제기하는 것입니다.

를 사용할 때 ValueError생성자를 실행하는 클래스가 호출됩니다. ValueError()

를 사용 ValueError()하면 메서드 ValueError()가 직접 호출됩니다.

노트 : raise ValueError # shorthand for 'raise ValueError()'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.