summaryrefslogtreecommitdiffstats
path: root/pym/portage_util.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2006-04-15 05:26:44 +0000
committerZac Medico <zmedico@gentoo.org>2006-04-15 05:26:44 +0000
commit5210ef39ff48f5701a837931881680e65aebf716 (patch)
tree2f2889fa17923885f3c988498beafec590e4a7bf /pym/portage_util.py
parent64d1c57a97f56df9a4e96f8a0a4efa98bf7de010 (diff)
downloadportage-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.py24
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):