É generator.next () visível no python 3.0?
-
21-08-2019 - |
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.
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)'