프로그래밍언어/파이썬[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