有没有办法检测是否使用list()调用生成器的__iter__
?据我了解,list(obj)将调用__iter__
;但是,在无限生成器的情况下,我希望它返回一个错误。
例如,我有以下生成器:
def gen():
while 1:
yield 1
由于调用list(gen)将导致无限循环,我想使它返回错误。有没有办法做到这一点?
答案 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: