2017-09-06 33 views
1

저는 파이썬에서 컨텍스트 관리자를 사용합니다. 에서 일부 로그를 다시 얻으려면 내 __exit__ 방법. 그래서 내 코드에 다음과 같은 기록합니다파이썬 컨텍스트 관리자에서 __exit__의 반환 값을 검색 할 수 있습니까?

class MyContextManager: 
    def __init__(self, value1, value2) 
     self.value1 = value1 
     self.value2 = value2 

    def __enter__(self) 
     # Do some other stuff 
     return self 

    def __exit__(self, exc_type, exc_val, exc_tb): 
     # Do some tear down action, process some data that is 
     # created in __enter__ and log those results 
     return my_results 

with MyContextManager(value1=my_value1, value2=my_value2) as manager: 
    # Do some stuff 

어떻게 내가 블록 내의 후 (또는 끝) __exit__에서 반환 my_results에 액세스 할 수 있습니다. 심지어 __exit__ 메서드에서 다른 True를 반환하는 것이 합법입니까?

답변

3

__exit__ 메서드에서 다른 True를 반환하는 것이 합법적입니까?

아니요, 실제로는 아니지만 Python은 truth value을 테스트하기 만하면됩니다. 즉, 여기서 진리 개체를 반환하면 예외가 표시되지 않습니다. 예외가 없으면 진실 값을 반환하는 것은 아무 것도 할 수 없습니다.

블록이있는 내 (또는 끝에) __exit__에서 반환되는 my_results에 어떻게 액세스 할 수 있습니까?

수 없습니다. with 표현 기계가 그것을 소비했습니다.

다른 방법으로도 사용할 수 있도록 설정해야합니다. 콘텍스트 관리자에 속성으로 설정하는 것은 그 자체 개체 다음 with 블록이 완료된 후

class MyContextManager: 
    def __init__(self, value1, value2) 
     self.value1 = value1 
     self.value2 = value2 

    def __enter__(self) 
     # Do some other stuff 
     return self 

    def __exit__(self, exc_type, exc_val, exc_tb): 
     # Do some tear down action, process some data that is 
     # created in __enter__ and log those results 
     self.my_results = my_results 
     # returning None, we don't want to suppress exceptions 
     return None 

with MyContextManager(value1=my_value1, value2=my_value2) as manager: 
    # Do some stuff 

results = manager.my_results 

manager 이름을 사용할 수있다.

예를 들어 unittest.TestCase.assertRaises() context manager이 캡처 된 예외를 공유하는 방법입니다.

+0

대단히 감사합니다! 유용한 정보! :) MyContextManager의 인스턴스가 with 블록 뒤에 여전히 살아 있다는 것을 알지 못했습니다. –

+0

도움이 된 것을 기쁘게 생각합니다! 유용하다고 생각되면 [내 대답 수락] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)을 자유롭게 느껴보십시오. :-) –