1

我倾向于经常使用 Python 的“with”语句。主要用于在我将一些文件符号链接或复制到目录后清理目录,因为即使 python 脚本崩溃,任务仍然会执行。这是我的函数的一个示例,可以与“with”语句一起使用。

@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 回答