Dělat objekty Python generátor stát „nepoužitelné“ poté, co byl překročen?

hlasů
7

Byl jsem pracoval na projektu baňce získání nějaké data z obalu API. Obálka se vrátil objekt generátoru, a tak jsem printse hodnoty ( for obj in gen_object: print obj) před jeho odesláním do baňky se render_template().

Při podávání žádosti o stránku, zatímco printing objektů, stránka je prázdná. Ale odstranění forsmyčky stránka vykresluje obsah objektu generátoru.

@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)
Položena 06/08/2011 v 09:40
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
9

Ano, generátory jsou určena pro konzumaci jednou. Pokaždé, když jsme se opakovat generátor jsme ho požádat, aby nám jiné hodnoty, a jestliže neexistuje více hodnot dát výjimka Výjimku StopIteration je vyvolána, který by zastavit iteraci. Neexistuje žádný způsob, jak generátor, aby věděli, že chceme, aby to znovu opakovat, aniž by klonováním.

Tak dlouho, jak záznamy se vejde pohodlně do paměti, tak bych použít seznam místo:

top_stories = list(top_stories)

Tímto způsobem můžete iteraci top_stories vícekrát.

K dispozici je funkce nazvaná itertools.tee kopírovat iterátor, že i vám může být nápomocný, ale to je někdy pomalejší, než jen s použitím seznamu. Reference: http://docs.python.org/library/itertools.html?highlight=itertools.tee#itertools.tee

Odpovězeno 06/08/2011 v 09:46
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more