gpt4 book ai didi

python - 上下文管理器作为装饰器,可以访问生成的对象

转载 作者:行者123 更新时间:2023-12-03 08:48:29 33 4
gpt4 key购买 nike

我有一个对象的上下文管理器,可以类似于open上下文管理器使用,例如

with MyContextManager as cm:
cm.do_something()

我知道,如果使用 contextlib.ContextDecorator 来创建一个简单的上下文管理器,则可以将其制作为装饰器。如果使用装饰器,是否也可以访问从上下文管理器生成的对象?例如。给定上面的上下文管理器,类似于:

@cmdecorator
def my_function(self, cm):
cm.do_something

我无法让它发挥作用。要么我错过了一些微不足道的东西(希望如此),要么这是不可能的......它最终只是语法糖,但如果可能的话我很感兴趣。

最佳答案

回答我自己的问题:虽然没有自动机制,但编写一个完全执行此操作的装饰器很容易(使用硬编码的关键字参数):

def patch_cm(f):
@functools.wraps(f)
def decorated(*args, **kwargs):
with MyContextManager() as cm:
kwds['cm'] = cm
return f(*args, **kwargs)

return decorated

可以使用(这里在单元测试中):

class MyContextManagerTest(TestCase):
@patch_cm
def test_context_decorator(self, cm):
cm.do_something()
self.assertTrue(cm.done())

这与:

相同
def test_context_decorator(self):
with MyContextManager() as cm:
cm.do_something()
self.assertTrue(cm.done())

(我实际使用的是带有参数的包装器,但这只是另一个包装器......)

这也可以使用位置参数而不是关键字参数(我最终使用了):

def patch_cm(f):
@functools.wraps(f)
def decorated(*args, **kwargs):
with MyContextManager() as cm:
args = list(args)
args.append(cm)
return f(*args, **kwargs)

return decorated

关于python - 上下文管理器作为装饰器,可以访问生成的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60383524/

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