Pergunta

Eu tenho um gerador que gera uma série, por exemplo:

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

em python 2.6 Eu sou capaz de fazer as seguintes chamadas:

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

No entanto, em 3,0 se eu executar as mesmas duas linhas de código que estou recebendo o seguinte erro:

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

mas, a sintaxe de loop iteração funciona em 3,0

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

Eu não tenho sido capaz de encontrar qualquer coisa ainda que explica essa diferença de comportamento para 3.0.

Foi útil?

Solução

Correto, g.next() foi renomeado para g.__next__(). A razão para isso é a consistência: métodos especiais como __init__() e __del__ todos têm sublinhados duplos (ou "Dunder" no vernáculo atual), e .next() foi uma das poucas exceções a essa regra. Este foi fixo em 3,0 Python. [*]

Mas em vez de chamar g.__next__(), como diz Paolo, o uso next(g).

[*] Há outros atributos especiais que tenham obtido essa correção; func_name, é agora __name__, etc.

Outras dicas

Tente:

next(g)

Confira esta tabela puro que mostra as diferenças na sintaxe entre 2 e 3, quando se trata deste.

Se o seu código deve ser executado em python2 e Python3, utilize o 2to3 biblioteca seis como este :

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top