gpt4 book ai didi

python - 为什么生成器不是上下文管理器?

转载 作者:行者123 更新时间:2023-11-28 21:54:34 24 4
gpt4 key购买 nike

生成器可以管理资源,例如通过上下文管理器内部的 yield'ing。一旦生成器的 close() 方法被调用(或引发异常),资源就会被释放。

因为很容易忘记最后调用 close(),我认为显然也可以为此使用上下文管理器(以及处理潜在的异常)。我知道我可以使用 contextlib.closing为此,直接在 with 语句中使用生成器不是更好吗?

生成器是上下文管理器有什么理由吗?

最佳答案

一般来说,您没有将更多生成器视为上下文管理器的原因是它们旨在解决不同的问题,反之亦然。上下文管理器的出现是因为它提供了一种将可执行​​代码限定在资源范围内的简洁明了的方法。

有一个很好的理由,您可能希望将实现 __iter__() 的类与上下文管理器分开,即单一职责原则。单一职责归结为概念

Make a class do one thing and do it well

列表是可迭代的,但那是因为它们是一个集合。除了他们持有的东西之外,他们不管理任何状态,迭代只是访问该状态的另一种方式。除非您需要迭代作为访问包含对象状态的一种方式,否则我看不出将两者混合搭配的理由。即使那样,我也会竭尽全力以真正的 OO 风格将其分离出来。

关于python - 为什么生成器不是上下文管理器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24021648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com