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.

È stato utile?

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)'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top