구현이 보류 중이지만 추상적이지는 않은 메소드에 대해 NotImplementedError를 발생시키는 것이 일반적입니까?


34

NotImplementedError구현하려는 메소드에 대해 를 높이고 싶지만 아직 수행하지 않은 곳에서. 이미 부분적으로 구현했을 수도 있지만 raise NotImplementedError()아직 마음에 들지 않기 때문에 앞에 추가하십시오 . 다른 한편으로, 나는 또한 다른 사람들이 내 코드를 유지하는 것을 더 쉽게 할 수 있고 좋은 이유 때문에 규칙이 존재할 수 있기 때문에 규칙을 고수하고 싶습니다.

그러나 NotImplementedError 상태에 대한 Python 설명서는 다음과 같습니다.

이 예외는 RuntimeError에서 파생됩니다. 사용자 정의 기본 클래스에서 추상 메소드는 메소드를 대체하기 위해 파생 클래스가 필요할 때이 예외를 발생시켜야합니다.

그것은 내가 설명하는 것보다 훨씬 더 구체적이고 공식적인 사용 사례입니다. NotImplementedErrorAPI의이 부분이 진행중인 작업임을 간단히 나타 내기 위해 좋은 기존 스타일 입니까? 그렇지 않은 경우이를 나타내는 다른 표준화 된 방법이 있습니까?


"적절한"이란 무엇입니까?
Robert Harvey

1
@RobertHarvey 일반적인 사용법에 따라 일반적인 것을 의미한다고 가정합니다. 나는 지금 내 질문을 되풀이했다.
gerrit

1
여기서는 C #을 주로 사용하지만 여기서는 예외 처리가 관용적이며 다른 곳에서는 기대할 것입니다. 조기에 중단하고 큰 소리로 중단하는 것은 잠재적 문제를 신속하게 식별하기위한 좋은 지침입니다 (읽기 : 저렴).
Telastyn

일반적으로 클래스를 만드는 경우 기능을 구현할 때까지 TODO 주석을 구현되지 않은 메소드에 넣습니다. 그 전에 클래스가 프로덕션으로 릴리스 될 경우 예외를 던지는 것을 고려할 것입니다.

5
가치가있는 것은 IDE를 사용하여 "인터페이스를 구현"할 때 Microsoft Visual Studio가 기본적으로 수행하는 작업입니다. Robert Harvey는 결과가 잘 이해되고 있다고 말합니다.
catfood

답변:


34

파이썬 문서 가이 예외에 대한 유스 케이스 (그리고 아마도 정식 사례)를 제공하지만 다른 시나리오에서의 사용을 구체적으로 배제하지는 않습니다.

아직 기본 클래스의 메소드를 재정의하지 않은 경우 ( "인터페이스"를 만족시키기 위해) NotImplementedError 예외를 발생시키는 것이 적절하다고 생각합니다.

구글에 대한 피상적 인 검사가 제안 사람들이 당신이 무슨 뜻인지 이해 당신이 이런 식으로 예외를 사용하는 경우. 내가 아는 부작용이나 의도하지 않은 결과는 없습니다. 이 메소드는 예외가 호출되면 단순히 예외를 발생시키고 모든 사람이 잘 이해하는 예외를 발생시킵니다.


문서 파이썬 3이 정확한 사용법을 반영한다 :

사용자 정의 기본 클래스에서 추상 메소드는 메소드를 대체하기 위해 파생 클래스가 필요할 때 또는 실제 구현을 계속 추가해야 함을 나타 내기 위해 클래스를 개발할 때이 예외를 발생 시켜야합니다 . [엠파 시스 추가]


+1이지만 이런 종류의 컨벤션을 위해 약간의 문서가 먼 길을 갈 수 있다고 덧붙였습니다. dev wiki, repo readme, 또는 스타일 가이드 라인의 한 줄짜리 메모처럼-이 예외를 사용하는 것을 설명합니다.
Ben Lee

8

현지 (팀 또는 회사) 컨벤션에 의존해야하는지 여부에 관계없이 이해할 수 있습니다. 테스트가 메소드가 구현되지 않았 음을 결정하는 것이되어야하기 때문에 TDD와 관련하여 의미가 떨어집니다.

짧은 버전은 다음과 같습니다. 귀하와 귀하의 팀이 적절하다고 생각하면 사용하십시오.


5
FWIW, 예외를 던지는 것은 어떤 이유로 든 그 행동을 강요 해야하는 경우 테스트에 실패하는 좋은 방법이어야합니다. (예를 들어, 메소드 정의
인텔리전스

1

NotImplementedError일반적으로 다음과 같이 Python 기능 개발 자체에서 발생 하는 것으로 보입니다 .

@classmethod
def fromkeys(cls, iterable, v=None):
    # There is no equivalent method for counters because setting v=1
    # means that no element can have a count greater than one.
    raise NotImplementedError(
        'Counter.fromkeys() is undefined.  Use Counter(iterable) instead.')

다큐 멘 테이션

fromkeys (iterable)

이 클래스 메서드는 Counter 개체에 대해 구현되지 않았습니다.

출처

컬렉션. 카운터. 키

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