加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 是否有一个有意义的方法来使用发生器内的上下文管理器

发布时间:2020-12-16 23:17:02 所属栏目:Python 来源:网络整理
导读:from contextlib import contextmanager@contextmanagerdef context(): print "entering" yield print "exiting"def test(): with context(): for x in range(10): yield xfor x in test(): if x == 5: break # or raise 输出: entering 当循环中断时,有没
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

输出:

entering

当循环中断时,有没有办法使python自动调用上下文()的__exit__方法?还是其他一些实现同样目标的方法?我对于生成器和上下文管理器的了解使我怀疑这是不可能的,但是这使得内部管理器在生成器中是没有用的,不是吗?在我看来,一个块中的yield语句应该会引发一个红旗,上下文管理器__exit__可能不会运行.

解决方法

那么你可以用一个try / finally子句将context()函数中的yield包装起来:
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

输出:

entering
exiting

编辑:如果您尝试:help(contextmanager),它将显示它的“典型”使用示例,它们用yield / finally子句包装yield.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读