Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python生成器抽象基类没有';t实施必要的删除,这是故意的吗?_Python_Generator_Abstract Base Class - Fatal编程技术网

Python生成器抽象基类没有';t实施必要的删除,这是故意的吗?

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

Python中的生成器对象需要有一个
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