diff options
author | Zac Medico <zmedico@gentoo.org> | 2006-04-15 05:26:44 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2006-04-15 05:26:44 +0000 |
commit | 5210ef39ff48f5701a837931881680e65aebf716 (patch) | |
tree | 2f2889fa17923885f3c988498beafec590e4a7bf /pym/portage_util.py | |
parent | 64d1c57a97f56df9a4e96f8a0a4efa98bf7de010 (diff) | |
download | portage-5210ef39ff48f5701a837931881680e65aebf716.tar.gz portage-5210ef39ff48f5701a837931881680e65aebf716.tar.bz2 portage-5210ef39ff48f5701a837931881680e65aebf716.zip |
Add singleton support to LazyItemsDict to make it easier to use with arbitrary function calls.
svn path=/main/trunk/; revision=3149
Diffstat (limited to 'pym/portage_util.py')
-rw-r--r-- | pym/portage_util.py | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/pym/portage_util.py b/pym/portage_util.py index cd69733ba..a1e2d0227 100644 --- a/pym/portage_util.py +++ b/pym/portage_util.py @@ -722,15 +722,31 @@ class LazyItemsDict(dict): self.update(initial_items) if isinstance(initial_items, LazyItemsDict): self.lazy_items.update(initial_items.lazy_items) - def addLazyItem(self, item_key, value_callable): + def addLazyItem(self, item_key, value_callable, *pargs, **kwargs): """Add a lazy item for the given key. When the item is requested, - value_callable will be called with no arguments.""" - self.lazy_items[item_key] = value_callable + value_callable will be called with *pargs and **kwargs arguments.""" + self.lazy_items[item_key] = (value_callable, pargs, kwargs) # make it show up in self.keys(), etc... dict.__setitem__(self, item_key, None) + def addLazySingleton(self, item_key, value_callable, *pargs, **kwargs): + """This is like addLazyItem except value_callable will only be called + a maximum of 1 time and the result will be cached for future requests.""" + class SingletonItem(object): + def __init__(self, value_callable, *pargs, **kwargs): + self._callable = value_callable + self._pargs = pargs + self._kwargs = kwargs + self._called = False + def __call__(self): + if not self._called: + self._called = True + self._value = self._callable(*self._pargs, **self._kwargs) + return self._value + self.addLazyItem(item_key, SingletonItem(value_callable, *pargs, **kwargs)) def __getitem__(self, item_key): if item_key in self.lazy_items: - return self.lazy_items[item_key]() + value_callable, pargs, kwargs = self.lazy_items[item_key] + return value_callable(*pargs, **kwargs) else: return dict.__getitem__(self, item_key) def __setitem__(self, item_key, value): |