首页 新闻 会员 周边 捐助

以下 Python 代码使用 `@contextlib.contextmanager` 定义了一个上下文管理器。如果执行这段代码,最终的输出是什么?

0
[已解决问题] 解决于 2025-12-01 17:53

import contextlib

@contextlib.contextmanager
def managed_resource():
    print("enter")
    try:
        yield "resource"
    except ValueError:
        print("value_error handled")
    finally:
        print("exit")
with managed_resource() as res:
    print(f"using {res}")
    raise ValueError("Something went wrong")
print("done")
问题补充:
A
enter -> using resource -> value_error handled -> exit -> done
B
enter -> using resource -> value_error handled -> exit -> (程序因未捕获的 ValueError 异常而终止)
C
enter -> using resource -> exit -> (程序因未捕获的 ValueError 异常而终止)
D
enter -> using resource -> done -> (程序因未捕获的 ValueError 异常而终止)
*Tesla*的主页 *Tesla* | 小虾三级 | 园豆:1188
提问于:2025-12-01 16:46
< >
分享
最佳答案
0
正确答案:A
官方解析:
在 Python 上下文管理器中,`yield` 之前的代码在进入 `with` 块时执行(打印 'enter'),`yield` 返回资源后执行 `with` 块内代码(打印 'using resource')。当 `with` 块中引发 `ValueError` 时,异常被上下文管理器的 `except ValueError` 块捕获并处理(打印 'value_error handled'),然后 `finally` 块始终执行(打印 'exit')。异常被处理后,程序继续执行 `print('done')`。因此,输出序列为 'enter' -> 'using resource' -> 'value_error handled' -> 'exit' -> 'done',对应选项 A。选项 B、C、D 错误,因为它们要么忽略异常处理、要么错误地认为异常未捕获或顺序错误。
 
  • 在传统类式上下文管理器里,__enter__ 用 return 把值交给 as 变量;
  • with managed_resource() as res: # ← 这里的 res 就是“as 变量” print(res) # 会打印出 "resource" 执行过程: 上下文管理器的 __enter__ 把返回值交出来; Python 自动把这个返回值赋给 as 后面的变量(这里叫 res); 你在 with 块里就能用 res 访问它。 在 @contextlib.contextmanager 生成的管理器里,yield 就是替代那个 return 的语法点 然后raise ValueError,然后yield 之后的内容(包括 finally)变成 __exit__ 的逻辑。
*Tesla* | 小虾三级 |园豆:1188 | 2025-12-01 16:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册