È un generatore.next() visibile in python 3.0?

Ho un generatore che genera una serie, ad esempio:

def triangleNums():
    '''generate series of triangle numbers'''
    tn = 0
    counter = 1
    while(True):
        tn = tn + counter
        yield tn
        counter = counter + 1

in python 2.6 sono in grado di fare le seguenti chiamate:

g = triangleNums() # get the generator
g.next()           # get next val

tuttavia in 3.0, se provo a eseguire le stesse due righe di codice ricevo il seguente errore:

AttributeError: 'generator' object has no attribute 'next'

ma, l’iteratore di un ciclo di sintassi non funziona in 3.0

for n in triangleNums():
    if not exitCond:
       doSomething...

Io non sono stato in grado di trovare nulla che spiega questa differenza di comportamento per la 3.0.

InformationsquelleAutor jottos | 2009-07-02

 

3 Replies
  1. 355

    Corretto, g.next() è stato rinominato g.__next__(). La ragione di questo è la coerenza: metodi Speciali come __init__() e __del__ hanno tutte il doppio underscore (o “dunder” nell’attuale volgare), e .next() era una delle poche eccezioni alla regola. Questo è stato risolto in Python 3.0. [*]

    Ma invece di chiamare g.__next__(), come Paolo dice, utilizzare next(g).

    [*] Ci sono altri attributi speciali che hanno ottenuto questa correzione; func_name, è ora __name__, etc.

    • qualche idea del perché python 2 evitato la dunder convenzione per questi metodi, in primo luogo?
    • Che probabilmente è solo una svista.
  2. 11

    Se il codice deve essere eseguito con Python2 e Python3, utilizzare il 2to3 sei biblioteca come questo:

    import six
    
    six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'
    • Non c’è bisogno a meno che non avete bisogno di supporto Python versioni precedenti di 2.6. Python 2.6 e 2.7 sono il next funzione built-in.

Lascia un commento