Python“;加上;报表堆积
我倾向于经常使用Python的“with”语句。主要用于在我将一些文件符号链接或复制到目录后清理目录,因为即使python脚本崩溃,任务仍然会执行。下面是一个可以与“with”语句一起使用的函数的示例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) 我在使用这些语句时,它们往往会
@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中进行了扩展。