Python生成器抽象基类没有';t实施必要的删除,这是故意的吗?
Python中的生成器对象需要有一个Python生成器抽象基类没有';t实施必要的删除,这是故意的吗?,python,generator,abstract-base-class,Python,Generator,Abstract Base Class,Python中的生成器对象需要有一个close方法,以确保退出上下文管理器并try…最后:块在对象被垃圾收集之前运行 定义生成器必须实现的方法发送、抛出、关闭和删除。具体而言,它指出: g.\uu del\uu()是g.close()的包装器。当 生成器对象被垃圾收集(在CPython中,这是当其 引用计数变为零) 生成器的抽象类型在中 类生成器(迭代器): __插槽\uuux=() 定义下一个(自我): “”“从生成器返回下一项。”。 当耗尽时,提起StopIteration。 """ 返回s
close
方法,以确保退出上下文管理器并try…最后:
块在对象被垃圾收集之前运行
定义生成器必须实现的方法发送
、抛出
、关闭
和删除
。具体而言,它指出:
g.\uu del\uu()
是g.close()的包装器。当
生成器对象被垃圾收集(在CPython中,这是当其
引用计数变为零)
生成器的抽象类型在中
类生成器(迭代器):
__插槽\uuux=()
定义下一个(自我):
“”“从生成器返回下一项。”。
当耗尽时,提起StopIteration。
"""
返回self.send(无)
@抽象方法
def发送(自身,值):
“”“将值发送到生成器中。”。
返回下一个生成的值或提升StopIteration。
"""
提出停止迭代
@抽象方法
def抛出(自身、典型、val=None、tb=None):
“”“在生成器中引发异常。”。
返回下一个生成的值或提升StopIteration。
"""
如果val为无:
如果tb为无:
饲养类型
val=typ()
如果tb不是无:
val=val.with_回溯(tb)
提高val
def关闭(自我):
“”“在发电机内部提升发电机退出。”。
"""
尝试:
自投(GeneratorExit)
除了(GeneratorExit、StopIteration):
通过
其他:
引发运行时错误(“生成器忽略GeneratorExit”)
@类方法
定义子类钩子类(cls,C):
如果cls是发电机:
返回"检查"方法(C,"iter","next",,
“发送”、“抛出”、“关闭”)
返回未执行
此抽象类型强制执行子类中实现的发送
、抛出
和关闭
,但不抽象或具体地实现\uu删除
,也不强制实现它。它的元类也没有
天真的是,生成一个子类,而不是手动定义一个包装关闭的\uu del\uu
的将生成一个在关闭后没有正确清理的生成器。垃圾收集器只调用\uuuu del\uuu
,因此如果\uuuu del\uuu
不存在,则不会调用关闭
这是故意的吗
在一篇文章中,他向我指出,\uuuu del\uuuu
可能很难实现,如所示,但我不明白为什么这不适用于正确实现\uu del\uuu
作为Python本机生成器对象中的close
的包装器。这似乎是有意的。在python bugtracker上讨论这一点时,Guido说
\uuuu del\uuuu
方法的存在可能会对
GC,所以我担心现在向该类添加\uu del\uu
会
中断当前正在工作的代码
让我们不要破坏生成器类的稳定性
FWIW,生成器abc实现是有文档记录的,但它没有提到\uu del\uu
。