[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