首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python硬编码上下文管理器

Python硬编码上下文管理器
EN

Stack Overflow用户
提问于 2021-04-01 21:52:23
回答 1查看 51关注 0票数 0

我必须执行一段代码,它或多或少如下所示:

代码语言:javascript
复制
FPGA.send('enter read mode')
FPTA.send('read')
FPGA.send('exit read mode')

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

代码语言:javascript
复制
FPGA.send('enter read mode')
try:
    FPGA.send('read')
except Exception as e:
    rise e
finally:
    FPGA.send('exit read mode')

但我想知道是否有更多的pythonic方式来实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2021-04-01 22:05:45

contextlib.contextmanager装饰器为创建上下文管理器对象提供了一个很好的快捷方式,您不需要实现__enter____exit__方法。

代码语言:javascript
复制
from contextlib import contextmanager

@contextmanager
def read_mode():
    FPGA.send('enter read mode')
    try:
        yield
    finally:
        FPGA.send('exit read mode')

然后,您可以像这样使用此上下文管理器:

代码语言:javascript
复制
with read_mode():
    FPGA.send('read mode')

@contextmanager函数中的yield将控制权交给上下文中的代码块。当上下文退出时(无论是正常退出还是通过引发的异常退出),都会执行finally块。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66905820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档