在我的代码中,我需要能够正确打开和关闭设备,因此需要使用上下文管理器。虽然上下文管理器通常被定义为具有__enter__
和__exit__
方法的类,但似乎也有可能装饰一个函数以与上下文管理器一起使用(参见最近的一篇文章和另一个很好的例子)。
在以下(工作)代码片段中,我实现了两种可能性;只需要将注释行与另一行交换:
import time
import contextlib
def device():
return 42
@contextlib.contextmanager
def wrap():
print("open")
yield device
print("close")
return
class Wrap(object):
def __enter__(self):
print("open")
return device
def __exit__(self, type, value, traceback):
print("close")
#with wrap() as mydevice:
with Wrap() as mydevice:
while True:
time.sleep(1)
print mydevice()
我尝试的是运行代码并使用CTRL-C
. 当我Wrap
在上下文管理器中使用该类时,该__exit__
方法按预期调用(在终端中打印文本“关闭”),但是当我使用该wrap
函数尝试相同的操作时,文本“关闭”不会打印到终端。
我的问题:代码片段是否有问题,我是否遗漏了什么,或者为什么print("close")
没有使用装饰函数调用该行?