gpt4 book ai didi

python - 用 Python 编写上下文管理器,它本身使用 with 语句

转载 作者:太空狗 更新时间:2023-10-29 17:42:53 25 4
gpt4 key购买 nike

我正在尝试编写一个使用其他上下文管理器的上下文管理器,因此客户不需要知道整个配方,只需要知道我正在呈现的界面。我无法使用 @contextmanager 执行此操作 - 如果您被异常打断,则 yield 调用后的代码不会执行,因此我需要使用一个类- 经理。

这是一个小示例脚本:

from contextlib import contextmanager
import pprint

d = {}

@contextmanager
def simple(arg, val):
print "enter", arg
d[arg] = val
yield
print "exit", arg
del d[arg]

class compl(object):
def __init__(self, arg, val):
self.arg=arg
self.val=val

def __enter__(self):
with simple("one",1):
with simple("two",2):
print "enter complex", self.arg
d[self.arg] = self.val

def __exit__(self,*args):
print "exit complex", self.arg
del d[self.arg]

print "before"
print d
print ""

with compl("three",3):
print d
print ""

print "after"
print d
print ""

输出这个:

before
{}

enter one
enter two
enter complex three
exit two
exit one
{'three': 3}

exit complex three
after
{}

我希望它输出这个:

before
{}

enter one
enter two
enter complex three
{'one': 1, 'three': 3, 'two': 2}

exit complex three
exit two
exit one
after
{}

有什么方法可以让基于类的上下文管理器用其他上下文管理器包装自己?

最佳答案

@contextmanager
def compl(arg, val):
   with simple("one",1):
        with simple("two",2):
print "enter complex", arg
try:
                d[arg] = val
yield
finally:
        del d[arg]
        print "exit complex", arg

关于python - 用 Python 编写上下文管理器,它本身使用 with 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11441042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com