【发布时间】:2018-07-14 18:29:37
【问题描述】:
在 python 中,有没有办法让函数/类表现得像函数和上下文管理器?
注意:我需要该函数/类来返回一个没有__exit__ 方法的对象,并且我无法更改该对象(这就是我包装它的原因)。
所以仅仅用__enter__ 和__exit__ 来创建一个类是行不通的,因为我需要它也像一个函数一样工作。
我已经尝试过contextmanager 装饰器:
@contextmanager
def my_context_man(my_str):
my_str = 'begging ' + my_str
yield my_str+' after func'
print('end')
它在上下文管理器中完美运行,但不是作为函数:
a = 'middle'
old_a = my_context_man(a)
print('old_a', old_a)
with my_context_man(a) as new_a:
print('new_a', new_a)
输出:
old_a <contextlib._GeneratorContextManager object at 0x0000000004F832E8>
new_a begging middle after func
end
而期望的输出将是:
old_a begging middle after func
new_a begging middle after func
end
编辑:
我遇到的具体问题是psycopg2 模块。
我想使用不同的上下文管理器。它返回一个连接对象。
def connect(dsn=None, connection_factory=None, cursor_factory=None, **kwargs):
*the connection code*
return conn
我正在尝试对其进行更改,以便人们能够将它与我的上下文管理器一起使用,但不会破坏代码。 我无法更改 conn 对象
【问题讨论】:
-
这里有一些XY。类绝对有可能成为上下文管理器和函数。但是你想要达到什么目的还不清楚。
-
编辑了这个问题,我希望它现在更清楚了。 @StephenRauch
-
构造上下文管理器会给你一个上下文管理器。然后您可以调用该上下文管理器,或者如果您只是希望它返回一个字符串,也可以这样做。但是你还没有描述你实际上想要做什么。请阅读我之前评论中的 XY 链接。
-
不清楚您是否知道上下文管理器是什么或它的用途。
-
connection对象自 version 2.5 近 5 年前发布以来就可用作上下文管理器。
标签: python function oop python-decorators contextmanager