Python 上下文管理器作为具有对生成对象的访问权限的装饰器
我有一个对象的上下文管理器,可以使用类似于Python 上下文管理器作为具有对生成对象的访问权限的装饰器,python,python-decorators,contextmanager,Python,Python Decorators,Contextmanager,我有一个对象的上下文管理器,可以使用类似于打开的上下文管理器,例如 with MyContextManager as cm: cm.do_something() 我知道,如果使用contextlib.ContextDecorator来创建一个简单的上下文管理器,它就可以变成一个装饰器。如果使用装饰器,是否也可以访问从上下文管理器生成的对象?例如,考虑到上面的上下文管理器,类似于: @cmdecorator def my_function(self, cm): cm.do_som
打开的上下文管理器,例如
with MyContextManager as cm:
cm.do_something()
我知道,如果使用contextlib.ContextDecorator
来创建一个简单的上下文管理器,它就可以变成一个装饰器。如果使用装饰器,是否也可以访问从上下文管理器生成的对象?例如,考虑到上面的上下文管理器,类似于:
@cmdecorator
def my_function(self, cm):
cm.do_something
我不能让它工作。要么我错过了一些琐碎的事情(希望如此),要么这是不可能的。。。最后,这只是语法上的甜点,但如果可能的话,我很感兴趣。不。这在文章中有明确提到
请注意,将上下文管理器用作函数装饰器时还有一个额外的限制:无法访问\uuuu enter\uuu()
的返回值。如果需要该值,则仍然需要使用显式的with
语句
回答我自己的问题:虽然没有自动机制,但编写一个decorator来实现这一点很容易(使用硬编码的关键字参数):
可以使用(在单元测试中):
这与:
def test_context_decorator(self):
with MyContextManager() as cm:
cm.do_something()
self.assertTrue(cm.done())
(我实际使用的是一个带参数的包装器,但这只是多了一个包装器而已…)
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())