Python“;加上;报表堆积

Python“;加上;报表堆积,python,with-statement,contextmanager,Python,With Statement,Contextmanager,我倾向于经常使用Python的“with”语句。主要用于在我将一些文件符号链接或复制到目录后清理目录,因为即使python脚本崩溃,任务仍然会执行。下面是一个可以与“with”语句一起使用的函数的示例 @contextmanager def use_symlink(orig, dest): os.symlink(orig, dest) try: yield finally: os.unlink(link) 我在使用这些语句时,它们往往会

我倾向于经常使用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”语句一样轻松安全地执行上述操作?

您可以将多个上下文管理器放在同一个
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上,可以使用来管理多个上下文管理器:

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

ExitStack()
退出时,
use\u symlink
上下文管理器按相反顺序被拆除。

您可以使用
语句将多个上下文管理器置于同一
下:

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上,可以使用来管理多个上下文管理器:

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\u-symlink
上下文管理器在退出时按相反顺序被拆除。

使用use\u-symlink(a,b),使用use\u-symlink(c,b),使用
使用use\u-symlink(a,b),使用{u-symlink(c,b),…..。
?快告诉我。:-)(+1)哇,谢谢!我想知道为什么我从来没有偶然发现过这一点。@SimonStreicher:这是相当新的,语法仅在Python 2.7和3.1中进行了扩展。请告诉我。:-)(+1)哇,谢谢!我想知道为什么我从来没有偶然发现过这一点。@SimonStreicher:这是相当新的,语法仅在Python 2.7和3.1中进行了扩展。