Определите, вызывается ли генератор __iter__ с помощью list () - PullRequest
2 голосов
/ 31 января 2012

Есть ли способ определить, вызывается ли генератор __iter__ с помощью list ()? Как я понимаю, list (obj) будет вызывать __iter__; однако в случае бесконечного генератора я хочу, чтобы он возвращал ошибку.

Например, у меня есть следующий генератор:

def gen():
    while 1:
        yield 1

Поскольку вызов списка (gen) приведет к бесконечному циклу, я хочу сделать так, чтобы он возвращал ошибку. Есть ли способ сделать это?

Ответы [ 3 ]

4 голосов
/ 31 января 2012

Нет разумного способа сделать это . Возможно, вам удастся перехватить трассировку стека, но это будет уродливо и подвержено ошибкам.

(Очевидно, что вы пытаетесь сделать не то, как итераторы должны вести себя в Python, что является еще одной веской причиной не делать этого.)

Кроме того, он не будет зацикливаться вечно, но продолжайте пытаться выделить память для списка. Как только это не удается, выдается MemoryError, и переводчик может или не может восстановиться.

2 голосов
/ 31 января 2012

Не без ужасной черной магии, в которую я не буду вдаваться. Просто напишите в строке документации: «Это не исчерпывающий». И постарайтесь не вспоминать список вызовов на нем.

0 голосов
/ 01 февраля 2012

Хотя это было не то, о чем я просил, вот решение, которое делает в основном то же самое:

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: 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...