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())