zip y generadores
Chema Cortes
pych3m4 en gmail.com
Sab Feb 17 06:30:54 CET 2007
El 16/02/07, Pau Cervera Badia <cervera en ffn.ub.es> escribió:
> Si no es abusar mucho de la lista, para resolver el problema estuve
> jugando un poco más.
>
> Veo que no puedo sobrecargar el next de un file. Quería hacer algo como,
>
> def new_next(iter):
> def next():
> try:
> return iter.next(), iter.next()
> except StopIteration, e:
> raise e
> return next
>
> y llamarlo como
>
> def frames(fitxer, nparticules):
> f = open(fitxer)
> f.next()
> f.next = new_next(f) # <-- se para aquí: AttributeError: 'file'
> object attribute 'next' is read-only
Lo que quieres se denomina crear "métodos singleton". Por lo general,
siempre se pueden crear, con la excepción de los métodos heredados de
un tipo estándar. En este caso, 'next' viene heredado del tipo file,
por lo que no puede modificarse.
Siendo más precisos, habría que hablar de "descriptores", que es la
forma que tiene python de hacer funcionar las clases. Los descriptores
de los tipos estándar están definidos para que no se puedan escribir
ni borrar, sólo leer/ejecutar.
Solución: crea una clase derivada
>
> for frame_info, line in f:
> yield frame_info, frame[:nparticules] # frame ~ line
>
> con lo que tuve que hacer lo siguiente:
>
> def two_lines(iter):
> class _Nou:
> def __iter__(self):
> return self
> def next(self):
> try:
> return iter.next(), iter.next()
> except StopIteration, e:
> raise e
> return _Nou()
Estás empleando una función para generar la instancia (Patrón
Factoría). No parece una buena idea. Estaría mejor sacar la clase
fuera.
Quedaría algo así:
class F(file):
def next(self):
return super(F,self).next(),super(F,self).next()
que se emplearía así:
f=F(fitxer)
for frame_info, line in f:
...
Aunque, ya puestos, y aprovechando que ya tenemos el izip, porqué no
hacer simplemente:
f=open(fitxer)
for frame_info,line in izip(f,f):
....
> P.D: Mi intención principal no fue nunca destrozar el castellano, aunque
> puede haber sido un side effect que se me escapó de las manos. ;-)
Comprendo lo difícil que tiene que ser para los bilingües el ceñiros a
un idioma.
Más información sobre la lista de distribución Python-es