У меня есть какой-то способ построения структуры данных (скажем, из некоторого содержимого файла):
def loadfile(FILE):
return # some data structure created from the contents of FILE
Так что я могу делать такие вещи, как
puppies = loadfile("puppies.csv") # wait for loadfile to work
kitties = loadfile("kitties.csv") # wait some more
print len(puppies)
print puppies[32]
В приведенном выше примере я потратил кучу времени на чтение kitties.csv
и создание структуры данных, которую я никогда не использовал. Я хотел бы избежать этих потерь без постоянной проверки if not kitties
всякий раз, когда я хочу что-то сделать. Я хотел бы иметь возможность сделать
puppies = lazyload("puppies.csv") # instant
kitties = lazyload("kitties.csv") # instant
print len(puppies) # wait for loadfile
print puppies[32]
Так что, если я никогда не попытаюсь что-либо сделать с kitties
, loadfile("kitties.csv")
никогда не вызовут.
Есть ли какой-нибудь стандартный способ сделать это?
Поработав с ним немного, я нашел следующее решение, которое, кажется, работает правильно и довольно кратко. Есть ли альтернативы? Есть ли недостатки в использовании этого подхода, о которых я должен помнить?
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)
Что может быть еще лучше, если что-то подобное сработает:
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)
Но это не работает, потому что self
локально. На самом деле он звонит loadfile
каждый раз, когда ты что-то делаешь.