프로그래밍언어/파이썬[Error]

[파이썬][Error] 013. TypeError - __enter__ returned non-context-manager

about_IT 2025. 5. 26. 01:55
728x90

TypeError: __enter__ returned non-context-manager 오류는 with 문을 사용할 때, 해당 객체가 컨텍스트 매니저로서의 요건을 충족하지 못했을 경우 발생합니다. 즉, __enter__ 메서드를 구현했지만, 그 반환값이 __exit__을 포함하지 않거나, 컨텍스트 매니저 프로토콜을 완전히 따르지 않은 객체일 때 이 오류가 발생합니다.

파이썬의 with 문은 파일 처리, 리소스 정리, 데이터베이스 연결 등에서 컨텍스트 매니저를 사용해 자동으로 정리 작업을 수행할 수 있게 해주는 구조입니다. 이때 객체는 반드시 __enter____exit__ 두 메서드를 모두 정의하고 있어야 합니다.

● 오류 발생 예시

class NotContext:
    def __enter__(self):
        return object()

with NotContext() as obj:
    print(obj)

위 예시는 __enter__는 구현했지만, 반환값이 __exit__을 포함하지 않는 일반 객체이므로 오류가 발생합니다.

TypeError: __enter__ returned non-context-manager

● 올바른 코드 예시

class ProperContext:
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        pass

with ProperContext() as obj:
    print("컨텍스트 내부")

이 예시는 컨텍스트 매니저의 규칙을 제대로 따랐기 때문에 정상적으로 작동합니다.

● 자주 하는 실수

  • __enter__는 정의했지만 __exit__를 누락한 경우
  • __enter__에서 반환한 객체가 __exit__을 포함하지 않는 경우
  • 일반 객체나 함수 반환값을 with 문에 그대로 사용하는 경우

● 디버깅 팁

  • 클래스에 __enter____exit__가 모두 정의되어 있는지 확인
  • __enter__가 반환하는 객체도 컨텍스트 매니저인지 점검
  • contextlib 모듈의 contextmanager 데코레이터 사용 고려

● 결론

__enter__ returned non-context-manager 오류는 컨텍스트 매니저의 구조를 제대로 갖추지 않았을 때 발생합니다. with 문을 사용할 경우, 해당 클래스는 반드시 __enter____exit__ 메서드를 모두 포함해야 하며, __enter__가 반환하는 객체 또한 컨텍스트 매니저로서 작동할 수 있어야 합니다. 이러한 규칙을 지키면 안정적인 리소스 관리를 구현할 수 있습니다.

728x90