2012-11-26 2 views
1

에 __enter__에 의해 반환하기,이 코드가 있습니다예를 들어 __exit__

with MyClass() as x: 
    print 'I have only {0}'.format(x) 
    with MyClass() as y: 
     print 'I have {0} and {1}'.format(x, y) 
    print 'Again only {0}'.format(x) 

xy 모두 with 블록의 해당 종료 후 해제 초기화되어야한다. xyMyClass이 아닙니다.

__exit__에는 3 개의 인수 만 있고 각 인수는 없음 (예외가 제공되지 않은 경우)입니다.

방금 ​​블록이 종료되고 어떤 값이 __enter__에 의해 반환되었는지 __exit__에서 어떻게 확인할 수 있습니까?

(N.B. 코드는 스레드로부터 안전해야합니다).


예 :

당신이 당신의 상황을 처리하는 사용자 정의 클래스를 가지고 있기 때문에
class MyClass(object): 
    def __enter__(self): 
     if moon_phase > 0: 
      return 123 
     else: 
      return 456 
    def __exit__(self): 
     number = what_was_returned_by_enter() 
     print 'End of block with', number 


with MyClass() as x: 
    print x # 123 
    with MyClass() as y: 
     print x, 'and', y # 123 and 456 
    # printed "End of block with 456" 
    print x # 123 
# printed "End of block with 123" 
+0

그냥 인스턴스 변수에 저장하여 반환 된 값을 추적 : __exit__가 호출 될 때 다시 검색 할 수 있도록

다음은 인스턴스 __enter__의 반환 값을 저장합니다. – sloth

답변

3

, self 컨텍스트 관리 프로그램 인스턴스 될 것입니다.

방금 ​​종료 한 상태를 확인하려면 상태 (__init__() 생성 시간 또는 __enter__()에 저장된 상태)를 검사해야합니다.

class MyClass(object): 
    def __enter__(self): 
     if moon_phase > 0: 
      self.returnval = 123 
     else: 
      self.returnval = 456 
     return self.returnval 

    def __exit__(self, *args): 
     number = self.returnval 
     print 'End of block with', number 
+0

그러나 만약 내가 문장으로 중첩 된 쓰기,'self.returnval' 자식 블록의 시작에서 rewrited되며 나는 부모 블록에서 값을 잃게됩니다. – werehuman

+1

@werehuman : 아니요, 클래스 또는 메서드에서 변경할 수있는 기본 인수를 사용하지 않는 한 가능하지 않습니다. 각 컨텍스트 관리자는 별도의 인스턴스입니다. 특정 상황에서 코드가 작동하지 않는 이유 *를 파악하는 데 도움이 필요하면 예제 코드로 질문을 업데이트하십시오. –

+1

맞아요, 새로운 인스턴스를 만듭니다. 나는 매뉴얼을 읽을 것이다. – werehuman