2014-07-15 1 views
1

Python의 with exp() as obj: 구문은 '필수'입력 및 종료 메소드가있는 모든 객체에 적합합니다. 사람들이 obj.__del__을 확장하려고 시도하는 경우를 고려하면 __enter____exit__ 메소드를 대신 사용하는 것이 좋습니다.은 생성자를위한 컨텍스트 관리자입니다.

내가 처음 생각한 것은 입력 및 종료 메서드가있는 상태 시스템이었습니다. 어쨌든 처리 할 수있는 기본 요소이지만 상태 시스템의 실제 구현은 매우 간단합니다.

class State(object): 
    def __init__(self, strategy): 
     self.strategy = strategy 

    def __enter__(self, *args): 
     return self 

    def __call__(self, *args, **kwargs): 
     self.strategy(self, *args, **kwargs) 

    def __exit__(self, *args): 
     clean_up_things() 

... 
... 
... 
def state_handle(): 
    states = (State(foo), State(bar), State(eggs)) 
    for state in states: 
     with state() as s: 
      what_ever(s) 

그러나 하나는 일반적으로 try/finally 조항 및/또는 yield 문을 대체 with XXX as YYY 구문을 볼 수 있다는 것, 그리고 한 가지 내가 발견은 파이썬 커뮤니티는 특정 기능이있을 때 무엇을 기대 알고 좋아하는 것입니다 유지 구현. 따라서 올바른 문제를 해결하기 위해 잘못된 철자가 사용되면 여전히 잘못된 대답입니다.

파이썬은 특정 이유로 발전기에 대해 with...as 구문을 의도적으로 예약 했습니까? 아니면이 구문을 적용 할 수 있습니까? 목적이 있다면 그 목적은 무엇입니까? (나는 PEP 8에 with/as에 대한 언급을 거의 보지 못했습니다.

+0

적절한 PEP는 [343] (을 http : 당신이 읽을

원래 파이썬 개선 제안은 흥미로운 일이 될 수 있습니다.org/dev/peps/pep-0343 /). – jonrsharpe

+2

* 그러나 일반적으로 try/finally 절 및/또는 yield 문 대신에 XXX를 YYY 구문으로 사용하는 것으로 보입니다. 아니, 그렇지 않습니다. –

답변

1

오해가있는 것 같습니다.

는 [I]는 t 하나는 일반적으로

아니, 사람이하지 않는 시도/마침내 조항 및/또는 수율 문을 대체 YYY 구문으로 XXX로 보는 것 같다. 컨텍스트 관리자는 컨텍스트를 관리해야 할 때마다 을 사용할 수 있습니다. 유스 케이스는 괜찮습니다.

콘텍스트 관리자를 사용하여 try .. finally을 사용하면 하나가 usecase입니다. 발전기에 대한 아이디어를 어디서 얻었는지 잘 모르겠습니다. 유용한 @contextlib.contextmanager() decorator을 사용하면 생성기를 컨텍스트 관리자로 전환 할 수 있으므로 컨텍스트 관리자를 간단하게 만들 수 있습니다.

내가 파이썬 표준 라이브러리에 두 개 이상의 카운터 예를 생각할 수

:

  • unittest; 컨텍스트 관리자로 assertRaises을 사용하면 예외가 발생했다고 주장하고 예외의 측면을 테스트 할 수 있습니다.

  • decimal; localcontext은 십진수 정밀도, 반올림 및 기타 측면을 관리합니다. 당신이 생각할 수 try .. finallydecimal 상황 및 추가 스레드 안전성 층에 동일한 기능을 얻을 수 있지만 try .. finally 핸들러

이가되어 있지 교체; 그러나 그것은 훨씬 더 많은 일이 될 것입니다. //legacy.python : http://www.python.org/dev/peps/pep-0343/

관련 문제