检测是否使用list()调用生成器的__iter__

时间:2012-01-31 00:24:11

标签: python generator

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

例如,我有以下生成器:

def gen():
    while 1:
        yield 1

由于调用list(gen)将导致无限循环,我想使它返回错误。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:4)

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

(显然,你要做的不是迭代在Python中应该如何表现,这是不这样做的另一个好理由。)

此外,它不会永远循环,但继续尝试为列表分配内存。一旦失败,将抛出MemoryError,解释器可能会或可能不会恢复。

答案 1 :(得分:2)

不是没有可怕的黑魔法,我不会进入这里。只需写入文档字符串,“这不是详尽无遗的”。并试着记住不要在上面打电话。

答案 2 :(得分:0)

虽然这不是我要求的,但这里有一个基本相同的解决方案:

class test:
    def __init__(self):
        self.generate = self.gen()
        self.next = self.generate.next
    def gen(self):
        for a in range(10):
            yield a
    def __iter__(self):
        raise ValueError
>>> a = test()
>>> a.next()
0
>>> list(a)
ValueError: