0

我正在尝试使用控制访问子目录的上下文管理器,将它与生成器表达式结合起来似乎非常优雅,但它似乎不起作用。有什么办法可以纠正这个问题,以便我可以将两者一起使用?

这是示例:

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
4

1 回答 1

2

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

只有with语句管理实际上下文,触发 CM 上的__enter____exit__钩子。您可以在这里使用生成器表达式中生成的上下文管理器对象:

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

with语句cm.__enter__在此处调用,并在块完成时cm.__exit__调用。

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

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

因为创建上下文管理器作为该with行的一部分更容易理解。

于 2014-12-02T19:09:33.460 回答