save LazyLoadingDict in case we do want it later
This commit is contained in:
58
common/lib/xmodule/lazy_dict.py
Normal file
58
common/lib/xmodule/lazy_dict.py
Normal file
@@ -0,0 +1,58 @@
|
||||
from collections import MutableMapping
|
||||
|
||||
class LazyLoadingDict(MutableMapping):
|
||||
"""
|
||||
A dictionary object that lazily loads its contents from a provided
|
||||
function on reads (of members that haven't already been set).
|
||||
"""
|
||||
|
||||
def __init__(self, loader):
|
||||
'''
|
||||
On the first read from this dictionary, it will call loader() to
|
||||
populate its contents. loader() must return something dict-like. Any
|
||||
elements set before the first read will be preserved.
|
||||
'''
|
||||
self._contents = {}
|
||||
self._loaded = False
|
||||
self._loader = loader
|
||||
self._deleted = set()
|
||||
|
||||
def __getitem__(self, name):
|
||||
if not (self._loaded or name in self._contents or name in self._deleted):
|
||||
self.load()
|
||||
|
||||
return self._contents[name]
|
||||
|
||||
def __setitem__(self, name, value):
|
||||
self._contents[name] = value
|
||||
self._deleted.discard(name)
|
||||
|
||||
def __delitem__(self, name):
|
||||
del self._contents[name]
|
||||
self._deleted.add(name)
|
||||
|
||||
def __contains__(self, name):
|
||||
self.load()
|
||||
return name in self._contents
|
||||
|
||||
def __len__(self):
|
||||
self.load()
|
||||
return len(self._contents)
|
||||
|
||||
def __iter__(self):
|
||||
self.load()
|
||||
return iter(self._contents)
|
||||
|
||||
def __repr__(self):
|
||||
self.load()
|
||||
return repr(self._contents)
|
||||
|
||||
def load(self):
|
||||
if self._loaded:
|
||||
return
|
||||
|
||||
loaded_contents = self._loader()
|
||||
loaded_contents.update(self._contents)
|
||||
self._contents = loaded_contents
|
||||
self._loaded = True
|
||||
|
||||
@@ -11,66 +11,6 @@ import os
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
# # TODO (cpennington): This was implemented in an attempt to improve performance,
|
||||
# # but the actual improvement wasn't measured (and it was implemented late at night).
|
||||
# # We should check if it hurts, and whether there's a better way of doing lazy loading
|
||||
|
||||
# class LazyLoadingDict(MutableMapping):
|
||||
# """
|
||||
# A dictionary object that lazily loads its contents from a provided
|
||||
# function on reads (of members that haven't already been set).
|
||||
# """
|
||||
|
||||
# def __init__(self, loader):
|
||||
# '''
|
||||
# On the first read from this dictionary, it will call loader() to
|
||||
# populate its contents. loader() must return something dict-like. Any
|
||||
# elements set before the first read will be preserved.
|
||||
# '''
|
||||
# self._contents = {}
|
||||
# self._loaded = False
|
||||
# self._loader = loader
|
||||
# self._deleted = set()
|
||||
|
||||
# def __getitem__(self, name):
|
||||
# if not (self._loaded or name in self._contents or name in self._deleted):
|
||||
# self.load()
|
||||
|
||||
# return self._contents[name]
|
||||
|
||||
# def __setitem__(self, name, value):
|
||||
# self._contents[name] = value
|
||||
# self._deleted.discard(name)
|
||||
|
||||
# def __delitem__(self, name):
|
||||
# del self._contents[name]
|
||||
# self._deleted.add(name)
|
||||
|
||||
# def __contains__(self, name):
|
||||
# self.load()
|
||||
# return name in self._contents
|
||||
|
||||
# def __len__(self):
|
||||
# self.load()
|
||||
# return len(self._contents)
|
||||
|
||||
# def __iter__(self):
|
||||
# self.load()
|
||||
# return iter(self._contents)
|
||||
|
||||
# def __repr__(self):
|
||||
# self.load()
|
||||
# return repr(self._contents)
|
||||
|
||||
# def load(self):
|
||||
# if self._loaded:
|
||||
# return
|
||||
|
||||
# loaded_contents = self._loader()
|
||||
# loaded_contents.update(self._contents)
|
||||
# self._contents = loaded_contents
|
||||
# self._loaded = True
|
||||
|
||||
|
||||
_AttrMapBase = namedtuple('_AttrMap', 'metadata_key to_metadata from_metadata')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user