tengo alguna manera de construir una estructura de datos (de algunos contenidos de los archivos, por ejemplo):Cómo carga perezosa una estructura de datos (pitón)
def loadfile(FILE):
return # some data structure created from the contents of FILE
por lo que puedo hacer cosas como
puppies = loadfile("puppies.csv") # wait for loadfile to work
kitties = loadfile("kitties.csv") # wait some more
print len(puppies)
print puppies[32]
En el ejemplo anterior, perdí un montón de tiempo leyendo realmente kitties.csv
y creando una estructura de datos que nunca utilicé. Me gustaría evitar ese desperdicio sin consultar constantemente if not kitties
cada vez que quiero hacer algo. Me gustaría ser capaz de hacer
puppies = lazyload("puppies.csv") # instant
kitties = lazyload("kitties.csv") # instant
print len(puppies) # wait for loadfile
print puppies[32]
Así que si yo no he trato de hacer cualquier cosa con kitties
, loadfile("kitties.csv")
no es llamado.
¿Hay alguna forma estándar de hacerlo?
Después de jugar con él un poco, produje la siguiente solución, que parece funcionar correctamente y es bastante breve. ¿Hay algunas alternativas? ¿Hay inconvenientes en usar este enfoque que debo tener en cuenta?
class lazyload:
def __init__(self,FILE):
self.FILE = FILE
self.F = None
def __getattr__(self,name):
if not self.F:
print "loading %s" % self.FILE
self.F = loadfile(self.FILE)
return object.__getattribute__(self.F, name)
¿Cuál podría ser aún mejor si es algo como esto funcionó:
class lazyload:
def __init__(self,FILE):
self.FILE = FILE
def __getattr__(self,name):
self = loadfile(self.FILE) # this never gets called again
# since self is no longer a
# lazyload instance
return object.__getattribute__(self, name)
Pero esto no funciona debido a self
es local. En realidad, termina llamando al loadfile
cada vez que hace algo.
Es posible que desee un proxy '__nonzero__' y otros métodos también. – ephemient
@ephemient: parece que una llamada a '__nonzero__' pasará por' __getattr__', ¿cuál es el problema? –
Supongo que es un poco mejor decir 'si self.F no es None' en lugar de' if not self.F' ya que 'loadfile (FILE)' * might * puede ser 0 o la cadena vacía. –