1

私は、Python の "with" ステートメントを頻繁に使用する傾向があります。Pythonスクリプトがクラッシュしてもタスクは実行されるため、いくつかのファイルをディレクトリにシンボリックリンクまたはコピーした後、ディレクトリをクリーンアップすることがほとんどです。「with」ステートメントで使用できる on of my 関数の例を次に示します。

@contextmanager
def use_symlink(orig, dest):
    os.symlink(orig, dest)
    try: 
        yield
    finally:
        os.unlink(link)

これらをステートメントで使用する方法は、非常に急速に積み重なる傾向があります。

#Off to an adventure
with use_symlink(a, b):
    with use_symlink(c, b):
        with use_symlink(d, b):
            with working_dir(dir1):
                #do something
            with working_dir(dir2):
                #do something that creates file dir2_file1, dir2_file2
                with use_symlink(dir2_file1, b):
                   with use_symlink(dir2_file2, b):
                       with working_dir(b):
                           #Do the last thing
#Home safely

強力な "with" ステートメントと同じように簡単かつ安全に上記を行うためのより良い方法はありますか?

4

1 に答える 1

5

複数のコンテキスト マネージャーを同じwithステートメントの下に置くことができます。

with use_symlink(a, b), use_symlink(c, b), use_symlink(d, b):
    with working_dir(dir1):
        #do something
    with working_dir(dir2):
        #do something that creates file dir2_file1, dir2_file2
        with use_symlink(dir2_file1, b), use_symlink(dir2_file2, b), working_dir(b):
            #Do the last thing

Python 3 では、 を使用しcontextlib.ExitStack()て複数のコンテキスト マネージャーを管理できます。

from contextlib import ExitStack

with ExitStack() as stack:
    for combo in ((a, b), (c, b), (d, b)):
        stack.enter_context(use_symlink(*combo))
    with working_dir(dir1):
        # do something
    with working_dir(dir2):
        #do something that creates file dir2_file1, dir2_file2
        for combo in ((dir2_file1, b), (dir2_file2, b)):
            stack.enter_context(use_symlink(*combo))
        with working_dir(b):
            #Do the last thing

コンテキスト マネージャは、終了use_symlink時に逆の順序で取り壊されます。ExitStack()

于 2014-05-28T16:01:50.017 に答える