diff options
author | Zac Medico <zmedico@gentoo.org> | 2006-04-12 02:46:21 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2006-04-12 02:46:21 +0000 |
commit | a47f6c7c8713f0658aece434e6016c05239d0616 (patch) | |
tree | a1b4dfcffe6b2f3ec174f8e0d6764f07e996f085 /pym/portage_util.py | |
parent | 52f08e9f46ed7c31a1cc03b2e84441ea2f2bf356 (diff) | |
download | portage-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.py | 27 |
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) |