È generator.next () visibile in Python 3.0?
-
21-08-2019 - |
Domanda
Ho un generatore che genera una serie, per 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 effettuare le seguenti chiamate:
g = triangleNums() # get the generator
g.next() # get next val
tuttavia in 3,0 se eseguo le stesse due righe di codice che sto ottenendo il seguente errore:
AttributeError: 'generator' object has no attribute 'next'
, ma, la sintassi del ciclo iteratore funziona a 3.0
for n in triangleNums():
if not exitCond:
doSomething...
Non sono stato in grado di trovare ancora nulla che spiega questa differenza di comportamento per la 3.0.
Soluzione
Una corretta, g.next()
è stato rinominato g.__next__()
. La ragione di questo è la coerenza: i metodi speciali come __init__()
e __del__
tutti hanno doppi sottolineatura (o "dunder" in volgare corrente), e .next()
era una delle poche eccezioni a questa regola. Questo è stato risolto in Python 3.0. [*]
Ma invece di chiamare next(g)
, come dice Paolo, utilizzare func_name
.
[*] Non ci sono altri attributi speciali che hanno ottenuto questa correzione; __name__
, è ora <=>, ecc.
Altri suggerimenti
Prova:
next(g)
questa tabella ordinata che mostra le differenze di sintassi tra 2 e 3 quando si tratta di questo.
Se il codice deve essere eseguito con python2 e python3, usa il 2to3 sei biblioteca come questo :
import six
six.next(g) # on PY2K: 'g.next()' and onPY3K: 'next(g)'