首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在生成器中是否有使用上下文管理器的有意义的方法?

在生成器中是否有使用上下文管理器的有意义的方法?
EN

Stack Overflow用户
提问于 2011-06-01 15:00:48
回答 1查看 2.3K关注 0票数 12
代码语言:javascript
复制
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

产出:

代码语言:javascript
复制
entering

是否有一种方法可以使python在for-loop被中断时自动调用context()的-loop方法?还是用其他方法来达到同样的目的?我对生成器和上下文管理器的了解让我怀疑这是不可能的,但这使得上下文管理器在生成器中变得非常无用,不是吗?在我看来,在一个__exit__块中的yield语句应该会发出一个红旗,上下文管理器可能不会运行

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-01 15:25:27

好的,您可以在try()函数中用try/finally子句包装产生的结果:

代码语言:javascript
复制
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

产出:

代码语言:javascript
复制
entering
exiting

如果您尝试一个:help(contextmanager),,它将显示它是一个“典型的”使用示例,其中他们用一个/子句来包装收益。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6203300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档