是否有一种很好的方法可以复制以下代码以使用单个with
语句:
thing1 = Thing()
if two_things:
thing2 = Thing()
do_stuff(thing1)
if two_things:
do_stuff(thing2)
thing1.close()
if two_things:
thing2.close()
我可以使用2个单独的子句,但如果在这两个案例之间共享很多代码,那就非常糟糕了。
if two_things:
with Thing() as thing1, Thing() as thing2:
do_stuff(thing1)
do_stuff(thing2)
else:
with Thing() as thing:
do_stuff(thing1)
答案 0 :(得分:2)
"Supporting a variable number of context managers"
ExitStack
的主要用例是类文档中给出的用例:在单个with
语句中支持可变数量的上下文管理器和其他清理操作。可变性可能来自需要由用户输入驱动的上下文管理器的数量(例如打开用户指定的文件集合),或者来自某些上下文管理器是可选的:with ExitStack() as stack: for resource in resources: stack.enter_context(resource) if need_special_resource(): special = acquire_special_resource() stack.callback(release_special_resource, special) # Perform operations that use the acquired resources