Python硬编码上下文管理器

2024-10-02 00:31:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须执行一个大致如下的代码:

FPGA.send('enter read mode')
FPTA.send('read')
FPGA.send('exit read mode')

我希望确保执行'exit read mode'行,无论'read'行中是否存在问题。在Python中实现这一点最优雅的方法是使用上下文管理器。但是,我不想为这个FPGA对象编写__enter____exit__方法,因为这只是一个特殊情况。当我阅读本文时,我想以某种方式“硬编码”这种上下文管理器行为。我认为try{}块可以完成以下工作:

FPGA.send('enter read mode')
try:
    FPGA.send('read')
except Exception as e:
    rise e
finally:
    FPGA.send('exit read mode')

但我想知道是否有一种更具python风格的方法来实现这一点


Tags: 对象方法代码send编码管理器readmode
1条回答
网友
1楼 · 发布于 2024-10-02 00:31:24

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

相关问题 更多 >

    热门问题