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
相关产品推荐
相关产品推荐

