Python上下文管理器可以与生成器一起使用吗?

Python上下文管理器可以与生成器一起使用吗?,python,generator,contextmanager,generator-expression,Python,Generator,Contextmanager,Generator Expression,我试图使用一个上下文管理器来控制子目录的访问,将它与生成器表达式结合起来似乎非常优雅,但它似乎不起作用。有没有办法纠正这个问题,这样我就可以同时使用这两种方法 下面是一个例子: import os, sys from contextlib import contextmanager from glob import glob @contextmanager def visitDir(d): os.chdir(d) yield d os.chdir("..") path

我试图使用一个上下文管理器来控制子目录的访问,将它与生成器表达式结合起来似乎非常优雅,但它似乎不起作用。有没有办法纠正这个问题,这样我就可以同时使用这两种方法

下面是一个例子:

import os, sys
from contextlib import contextmanager
from glob import glob

@contextmanager
def visitDir(d):
    os.chdir(d)
    yield d
    os.chdir("..")

paths = [os.path.join('.', p[0:-1]) for p in glob('*/')]

def clean():
    for p in (visitDir(p) for p in paths): # This is the magic line
        print p
        print os.getcwd()

clean() # Context manager apparently expires within the generator expression

您需要控制上下文的进入和离开。生成器表达式没有更广泛上下文的概念,因此不能将上下文管理器放在生成器表达式中,并期望在生成时自动输入上下文管理器

只有
with
语句管理实际上下文,触发CM上的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。您可以在此处使用生成器表达式中生成的上下文管理器对象:

def clean():
    for cm in (visitDir(p) for p in paths):
        with cm as p:
            print p
            print os.getcwd()
with
语句调用
cm.\uuuu在此处输入\uuuu
,当块完成时调用
cm.\uuuu退出\uuuu

但我会发现以下内容更具可读性和可理解性:

def clean():
    for p in paths:
        with visitDir(p):
            print p
            print os.getcwd()

因为创建上下文管理器作为
with
行的一部分更容易理解;流不是一个适用于此的概念。但是,生成器表达式不创建流吗?计算只在每次获取新对象时发生,而不是像列表表达式那样预先进行。Python将一般概念称为迭代器。迭代器在提示时一次生成一个值。生成器表达式是以紧凑的方式生成生成器的语法,其中生成器是一种专门的迭代器。您可以将结果称为流,但Python在任何地方都没有使用这个术语来表示这个概念。我当时的工作似乎相当自由地使用了“流”。也是从。我是否误解了他们使用的术语?