我必须执行一段代码,它或多或少如下所示:
FPGA.send('enter read mode')
FPTA.send('read')
FPGA.send('exit read mode')我希望确保无论'read'行中是否存在问题,都能执行'exit read mode'行。在Python中实现这一点最优雅的方法是使用上下文管理器。但是,我不想为这个FPGA对象编写__enter__和__exit__方法,因为这只是一种特殊情况。当我阅读这篇文章时,我想以某种方式“硬编码”这个上下文管理器行为。我认为try except块可以完成这项工作:
FPGA.send('enter read mode')
try:
FPGA.send('read')
except Exception as e:
rise e
finally:
FPGA.send('exit read mode')但我想知道是否有更多的pythonic方式来实现这一点?
发布于 2021-04-01 22:05:45
contextlib.contextmanager装饰器为创建上下文管理器对象提供了一个很好的快捷方式,您不需要实现__enter__和__exit__方法。
from contextlib import contextmanager
@contextmanager
def read_mode():
FPGA.send('enter read mode')
try:
yield
finally:
FPGA.send('exit read mode')然后,您可以像这样使用此上下文管理器:
with read_mode():
FPGA.send('read mode')@contextmanager函数中的yield将控制权交给上下文中的代码块。当上下文退出时(无论是正常退出还是通过引发的异常退出),都会执行finally块。
https://stackoverflow.com/questions/66905820
复制相似问题