python - 检测生成器的 __iter__ 是否被 list() 调用

标签 python generator

有什么方法可以检测生成器的 __iter__ 是否被 list() 调用?据我了解,list(obj) 将调用 __iter__;但是,在无限生成器的情况下,我希望它返回一个错误。

例如,我有以下生成器:

def gen():
    while 1:
        yield 1

因为调用 list(gen) 会导致无限循环,所以我想让它返回一个错误。有办法做到这一点吗?

最佳答案

没有明智的方法可以做到这一点。您也许能够劫持堆栈跟踪,但它会很丑陋且容易出错。

(显然,您要尝试做的不是期望可迭代对象在 Python 中的行为方式,这是不这样做的另一个很好的理由。)

此外,它不会永远循环,而是不断尝试为列表分配内存。一旦失败,将抛出 MemoryError 并且解释器可能恢复也可能不恢复。

关于python - 检测生成器的 __iter__ 是否被 list() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9072791/

相关文章:

javascript - Go channel 与 JavaScript 生成器有何不同?

python dict时间之谜

Python:访问面向对象的变量?

javascript - 如何返回到随机文本生成器函数的开头?

python - 为什么Python协程不能递归调用?

python - 从生成器末尾建立索引

python - yield (yield) 有什么作用?

Python运行命令行(时间)

python - 在 docker 容器中创建 django super 用户而不输入密码

python - 循环分组依据、聚合并根据组创建新列