Lau*_*low 10 python generator contextmanager
from contextlib import contextmanager
@contextmanager
def context():
print "entering"
yield
print "exiting"
def test():
with context():
for x in range(10):
yield x
for x in test():
if x == 5:
break # or raise
Run Code Online (Sandbox Code Playgroud)
输出:
entering
Run Code Online (Sandbox Code Playgroud)
__exit__当for-loop被中断时,有没有办法让python自动调用context()的方法?或者其他一些实现相同目标的方式?我对生成器和上下文管理器的了解让我怀疑它是不可能的,但是这使得上下文管理器在内部生成器中相当无用,不是吗?在我看来,块yield内的语句with应该引发一个红旗,上下文管理器__exit__可能无法运行.
Ger*_*rat 17
好吧,你可以使用try/finally子句将yield包含在context()函数中:
from contextlib import contextmanager
@contextmanager
def context():
print "entering"
try:
yield
finally:
print "exiting"
def test():
with context():
for x in range(10):
yield x
for x in test():
if x == 5:
break # or raise
Run Code Online (Sandbox Code Playgroud)
输出:
entering
exiting
Run Code Online (Sandbox Code Playgroud)
编辑:如果您尝试:help(contextmanager),它将显示它的"典型"用法示例,其中使用try/finally子句包装yield.
| 归档时间: |
|
| 查看次数: |
1871 次 |
| 最近记录: |