python - explicacion - ¿Cómo implementa esta clase el método “__iter__” sin implementar “next”?
python yield explicacion (2)
Tengo el siguiente código en django.template:
class Template(object):
def __init__(self, template_string, origin=None, name=''<Unknown Template>''):
try:
template_string = smart_unicode(template_string)
except UnicodeDecodeError:
raise TemplateEncodingError("Templates can only be constructed from unicode or UTF-8 strings.")
if settings.TEMPLATE_DEBUG and origin is None:
origin = StringOrigin(template_string)
self.nodelist = compile_string(template_string, origin)
self.name = name
def __iter__(self):
for node in self.nodelist:
for subnode in node:
yield subnode
def render(self, context):
"Display stage -- can be called many times"
return self.nodelist.render(context)
La parte sobre la que estoy confundido está abajo. ¿Cómo funciona este método de __iter__
? No puedo encontrar el next
método correspondiente.
def __iter__(self):
for node in self.nodelist:
for subnode in node:
yield subnode
Esta es la única forma en que sé cómo implementar __iter__
:
class a(object):
def __init__(self,x=10):
self.x = x
def __iter__(self):
return self
def next(self):
if self.x > 0:
self.x-=1
return self.x
else:
raise StopIteration
ainst = a()
for item in aisnt:
print item
En tus respuestas, intenta usar ejemplos de código en lugar de texto, porque mi inglés no es muy bueno. Gracias.
De los docs :
Si el método
__iter__()
un objeto contenedor se implementa como un generador, devolverá automáticamente un objeto iterador (técnicamente, un objeto generador) que suministra los__iter__()
ynext()
.
Ese método __iter__
devuelve un generador de python (consulte la documentation ), ya que utiliza la palabra clave de yield
. El generador proporcionará el método next () automáticamente; citando la documentación:
Lo que hace que los generadores sean tan compactos es que los métodos __iter __ () y next () se crean automáticamente.
EDITAR:
Los generadores son realmente útiles. Si no está familiarizado con ellos, le sugiero que lea sobre ellos y juegue con un código de prueba.
Aquí hay más información sobre los iteradores y generadores de .