[pyar] Duda: longitud de un iterable.

Claudio Freire klaussfreire en gmail.com
Mie Sep 15 21:00:48 ART 2010


On Wed, Sep 15, 2010 at 8:12 PM, Roberto Alsina
<ralsina en netmanagers.com.ar>wrote:

> Estimados, tengo una duda.
>
> Si tengo un iterable "data" (o sea, algo sobre lo que puedo correr un for)
> y
> quiero averiguar su longitud, hago len(data)?
>

No, no podés pedir la longitud de un iterable sin iterarlo (y por
consiguiente consumirlo).

Yo había hecho algún día una clase (iterable) que desenrollaba on-demand
otro iterable si se le pedía len, justamente para resolver eso de la forma
más eficiente posible (o sea, no desenrollar si no se pedía len, pero
soportar la función).

Si vos sabés la cantidad de elementos que va a tener (como en tu ejemplo),
podés, en vez de un generador, implementar una clase que soporte ambos
protocolos (iterable y longitud):


class progress:
   def __init__(self, data, *args):
      self.data = data
      self.args = args

   def __iter__(self):
      it=iter(data)
      widget = QtGui.QProgressDialog(*args+(0,len(data)))
      c=0
      for v in it:
          QtCore.QCoreApplication.instance().processEvents()
          if widget.wasCanceled():
              raise StopIteration
          c+=1
          widget.setValue(c)
          yield(v)

   def __len__(self):
       return len(self.data)

Pero claro, no va a considerar lo que pasa cuando se trunca la iteración con
widget.wasCancelled. Igual, en tu caso, creo que no sería problema.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20100915/3a8962d6/attachment.html>


More information about the pyar mailing list