0

サブディレクトリへのアクセスを制御するコンテキスト マネージャを使用しようとしていますが、それをジェネレータ式と組み合わせると非常に洗練されているように見えますが、うまくいかないようです。2つを一緒に使用できるように、これを修正する方法はありますか?

次に例を示します。

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 に答える