Mat*_*ias 3 python generator contextmanager
生成器可以管理资源,例如通过yield从上下文管理器内部进行操作。一旦close()调用生成器的方法(或引发异常),资源就会被释放。
由于很容易忘记close()最后调用,我认为显然也可以使用上下文管理器(并且还可以处理潜在的异常)。我知道我可以使用contextlib.closing它,但是直接在语句中使用生成器不是更好吗with?
生成器不应该是上下文管理器有什么原因吗?
一般来说,您没有看到更多的生成器作为上下文管理器,反之亦然的原因是它们旨在解决不同的问题。上下文管理器的出现是因为它提供了一种干净、简洁的方式来将可执行代码的范围限定到资源。
您可能希望将实现__iter__()上下文管理器的类分开,这是一个很好的理由,即单一职责原则。单一责任归结为这个概念
让一个班级做一件事并把它做好
列表是可迭代的,但那是因为它们是一个集合。除了它们所持有的状态之外,它们不管理任何状态,迭代只是访问该状态的另一种方式。除非您需要迭代作为访问所包含对象的状态的手段,否则我看不出将两者混合和匹配在一起的理由。即使那样,我也会不遗余力地以真正的面向对象风格将其分离出来。
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |