Становятся ли объекты-генераторы Python «непригодными» после прохождения? - PullRequest
7 голосов
/ 06 августа 2011

Я работал над проектом Flask, получая некоторые данные из API-оболочки. Оболочка вернула объект-генератор, поэтому я print значения (for obj in gen_object: print obj), прежде чем передать его в Flask's render_template().

При запросе страницы при print объектах страница пуста. Но при удалении цикла for страница отображает содержимое объекта генератора.

@app.route('/')
def front_page():
    top_stories = r.get_front_page(limit=10)
    # this for loop prevents the template from rendering the stories
    for s in top_stories:
        print s
    return render_template('template.html', stories=top_stories)

1 Ответ

9 голосов
/ 06 августа 2011

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

Поскольку записи могут удобно помещаться в памяти, я бы использовал вместо этого список:

top_stories = list(top_stories)

Таким образом, вы можете повторять top_stories несколько раз.

Есть функция itertools.tee для копирования итератора, которая также может вам помочь, но иногда она медленнее, чем просто использование списка.Справка: http://docs.python.org/library/itertools.html?highlight=itertools.tee#itertools.tee

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...