[pyar] Curiosidades del Python
Alejandro J. Cura
alecu en protocultura.net
Lun Oct 24 23:57:32 ART 2011
2011/10/24 Roberto Alsina <ralsina en netmanagers.com.ar>:
> Ojeando el manual de Nuitka (http://t.co/MLvCt6nR) me crucé con esta
> lindura:
>
>>>> def f():
> ... x = (i for i in (yield) if (yield))
>
>>>> a=f(); print a
> <generator object f at 0x02269CB0>
>>>> a.next(); print a
> <generator object f at 0x02269CB0>
>>>> a.next(); print a
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 2, in f
> TypeError: 'NoneType' object is not iterable
>>>> a.next(); print a
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> StopIteration
>
>
> Que les parece? Porqué hace eso? Porque alguien querría hacer eso?
Me parece lo normal. Mirá:
>>> def g():
... print 1
... n = yield
... print n
... yield
... raise TypeError
... print 3
... yield
...
>>> a=g()
>>> a.next()
1
>>> a.next()
None
>>> a.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in g
TypeError
>>> a.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
El problema en tu ejemplo fue que el segundo a.next() termina pasando
None al primer yield, cuando le debería estar pasando una lista sobre
la que iterar, y para eso se usa a.send(...)
El segundo yield no se llega a ejecutar nunca, porque el generador x no se usa.
saludos,
--
alecu
More information about the pyar
mailing list