, 나는 다음과 같은 코드가 작동하지 않는 것으로 나타났습니다 :왜`with`가 클래스가 아닌`__enter__`을 사용합니까? 런타임에 컨텍스트 매니저 패치 실험을하는 동안 내가 예상대로
class B:
def __enter__(self):
print('normal')
def __exit__(self, *stuff):
pass
def modify(self, x):
def other(self):
print('not normal: ', x)
self.__enter__ = other.__get__(self, type(self))
def main():
b = B()
b.__enter__()
b.modify('hi')
b.__enter__()
with b:
print('in with')
b.__enter__()
if __name__ == '__main__':
main()
실행이 인쇄 :
normal
not normal: hi
normal
in with
not normal: hi
동안 main
의 첫 번째 부분 , __enter__
에 대한 명시 적 호출이 예상대로 작동합니다 (은이 올바르게 수정 됨). with
- 구문은이를 무시한 것 같습니다.
일부 검색을 수행 한 결과, PEP 343에 따라 동작이 설명 된 것으로 나타났습니다. 즉, with mgr: ...
의 번역은 내부적으로 제가 위에서하고있는 것처럼, 대신에 직접 메서드 호출의
type(mgr).__enter__(mgr)
같은 것을 사용합니다.
그리고 그 이유가 궁금합니다. 저 같은 사람들이 어지럽게 흩어 지거나, 더 깊은 이유가있는 것을 막는 것입니까?
나는 두 번째 주장을 완전히 이해하지 못했을 것이다. 당신이 원하면, 그것을 향상 시키십시오. – phg