2
한다고 가정을 사용하여 정의?컨텍스트 관리자에게 보내는 내가 컨텍스트 매니저가 contextlib.contextmanager
내가 시도 :
my_cm = cm()
with my_cm:
my_cm.gen.send(123)
하지만 StopIteration을 얻을, 어떤이 send
수율 때문에 될 수 있을까요?
한다고 가정을 사용하여 정의?컨텍스트 관리자에게 보내는 내가 컨텍스트 매니저가 contextlib.contextmanager
내가 시도 :
my_cm = cm()
with my_cm:
my_cm.gen.send(123)
하지만 StopIteration을 얻을, 어떤이 send
수율 때문에 될 수 있을까요?
@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)
작품은 다시 발전기를 일시 정지합니다.
감사합니다. 나는 Pythonic이 아니야? 어쩌면 굴복 된'y'에 속성을 설정하여'z'를 보내야할까요? –
Pythonic인지 확실하지 않습니다. 그것은'@ contextmanager '의 유즈 케이스 밖에있다. 전 전용 클래스를 사용하고 (단지'__enter__'과'__exit__'를 구현하십시오), 필요한 모든 메소드를 추가하십시오. –
하지만 실제로 처리 할 수있는'cm()'생성기에서 뭔가를 얻을 수 있습니다. 그런 다음 * 그 * 객체를 사용하여'g()'에 무언가를 전달하십시오. 나는 전용 수업을 선호한다. –