summaryrefslogtreecommitdiffstats
path: root/pym/portage_util.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2006-04-12 02:46:21 +0000
committerZac Medico <zmedico@gentoo.org>2006-04-12 02:46:21 +0000
commita47f6c7c8713f0658aece434e6016c05239d0616 (patch)
treea1b4dfcffe6b2f3ec174f8e0d6764f07e996f085 /pym/portage_util.py
parent52f08e9f46ed7c31a1cc03b2e84441ea2f2bf356 (diff)
downloadportage-a47f6c7c8713f0658aece434e6016c05239d0616.tar.gz
portage-a47f6c7c8713f0658aece434e6016c05239d0616.tar.bz2
portage-a47f6c7c8713f0658aece434e6016c05239d0616.zip
Create a generic portage_util.LazyItemsDict and use it for lazy initialization portage.db[root] items.
svn path=/main/trunk/; revision=3133
Diffstat (limited to 'pym/portage_util.py')
-rw-r--r--pym/portage_util.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/pym/portage_util.py b/pym/portage_util.py
index 46a7d1052..6fd76090c 100644
--- a/pym/portage_util.py
+++ b/pym/portage_util.py
@@ -710,3 +710,30 @@ def ensure_dirs(dir_path, *args, **kwargs):
raise
perms_modified = apply_permissions(dir_path, *args, **kwargs)
return created_dir or perms_modified
+
+class LazyItemsDict(dict):
+ """A mapping object that behaves like a standard dict except that it allows
+ for lazy initialization of values via callable objects. Lazy items can be
+ overwritten and deleted just as normal items."""
+ def __init__(self):
+ dict.__init__(self)
+ self.lazy_items = {}
+ def addLazyItem(self, item_key, value_callable):
+ """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
+ # make it show up in self.keys(), etc...
+ dict.__setitem__(self, item_key, None)
+ def __getitem__(self, item_key):
+ if item_key in self.lazy_items:
+ return self.lazy_items[item_key]()
+ else:
+ return dict.__getitem__(self, item_key)
+ def __setitem__(self, item_key, value):
+ if item_key in self.lazy_items:
+ del self.lazy_items[item_key]
+ dict.__setitem__(self, item_key, value)
+ def __delitem__(self, item_key):
+ if item_key in self.lazy_items:
+ del self.lazy_items[item_key]
+ dict.__delitem__(self, item_key)