2013-05-15 6 views

답변

2

@contextmanager 차례로 컨텍스트를 관리하는 방법으로 발전기를 사용하는 GeneratorContextManager 인스턴스를 반환하는 도우미 함수를 반환합니다.

next()__enter__으로 전화를 걸 수있는 용도로 사용하지 않습니다. 당신은 시도하고 .gen 속성으로 기본 생성기에 액세스 할 수 있습니다 :

my_cm.gen.send(123) 

하지만 조기 종료에서 방법을 방지하기 위해 추가 yield 문을 포함해야 할 것이다. __exit__은 발전기를 종결하기 위해 next() 번으로 다시 전화 할 것입니다. 컨텍스트 매니저가 next() 마지막으로 전화를 할 준비가 될 때까지 두 번째 yield을 갖는 것을

@contextmanager 
def cm(x): 
    y = f(x) 
    a = yield y # Run for `__enter__`, returning `y`; `.send()` resumes here 
    yield   # Here we pause again 
    g(a) 

작품은 다시 발전기를 일시 정지합니다.

+0

감사합니다. 나는 Pythonic이 아니야? 어쩌면 굴복 된'y'에 속성을 설정하여'z'를 보내야할까요? –

+2

Pythonic인지 확실하지 않습니다. 그것은'@ contextmanager '의 유즈 케이스 밖에있다. 전 전용 클래스를 사용하고 (단지'__enter__'과'__exit__'를 구현하십시오), 필요한 모든 메소드를 추가하십시오. –

+1

하지만 실제로 처리 할 수있는'cm()'생성기에서 뭔가를 얻을 수 있습니다. 그런 다음 * 그 * 객체를 사용하여'g()'에 무언가를 전달하십시오. 나는 전용 수업을 선호한다. –