You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中在上下文管理器内部使用yield from是否安全?

生成器中上下文管理器的资源释放安全性分析

你的代码是安全的,上下文管理器会在任何场景下(包括迭代提前终止、异常抛出)优雅释放文件资源,具体原因如下:

  • 生成器函数里的with语句绑定了文件对象f,当生成器的迭代被终止——不管是zip取够10个元素后自然停止,还是循环中用break打断,甚至是中途抛出异常——Python都会自动触发生成器的关闭流程,此时with块的退出逻辑会执行,文件句柄会被正常关闭。
  • 哪怕迭代没完成就中断,生成器对象会被Python的垃圾回收机制处理,这个过程中会调用生成器的close()方法,进而触发with上下文的退出,确保文件资源被释放。

你可以加一行代码验证这个逻辑:

def get_random_strings():
    with open('/dev/urandom', 'rb') as f:
        print(f"初始状态文件是否关闭?{f.closed}")
        yield from map(bytes.hex, iter(f.readline, ''))
        print(f"迭代结束时文件是否关闭?{f.closed}")

当zip取完10个元素停止迭代后,生成器被回收,with块退出,文件会被自动关闭。

内容的提问来源于stack exchange,提问作者user3310334

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:53:09