diff options
author | Zac Medico <zmedico@gentoo.org> | 2009-02-24 05:14:37 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2009-02-24 05:14:37 +0000 |
commit | 32007587637eaef9f1f9648c8f3fdedb2e7e616c (patch) | |
tree | d69cc4bd41fa317203bfbe04b89d4ae0cbdd4931 | |
parent | 5ede2e2e08bee46023b2ac0ccb4c301ec5bda5dc (diff) | |
download | portage-32007587637eaef9f1f9648c8f3fdedb2e7e616c.tar.gz portage-32007587637eaef9f1f9648c8f3fdedb2e7e616c.tar.bz2 portage-32007587637eaef9f1f9648c8f3fdedb2e7e616c.zip |
If deepcopy() raises a TypeError for a lazy item that has been added via a
call to LazyItemsDict.addLazySingleton(), automatically evaluate the
the singleton and instead call deepcopy() on the result.
svn path=/main/trunk/; revision=12704
-rw-r--r-- | pym/portage/util.py | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/pym/portage/util.py b/pym/portage/util.py index 2cb14b34d..92f658c58 100644 --- a/pym/portage/util.py +++ b/pym/portage/util.py @@ -1139,6 +1139,10 @@ class LazyItemsDict(dict): If deepcopy() needs to work, this problem can be avoided by implementing lazy items with normal (non-bound) functions. + + If deepcopy() raises a TypeError for a lazy item that has been added + via a call to addLazySingleton(), the singleton will be automatically + evaluated and deepcopy() will instead be called on the result. """ if memo is None: memo = {} @@ -1148,9 +1152,17 @@ class LazyItemsDict(dict): for k in self: k_copy = deepcopy(k, memo) if k in self.lazy_items: - dict.__setitem__(result, k_copy, None) - result.lazy_items[k_copy] = \ - deepcopy(self.lazy_items[k], memo) + lazy_item = self.lazy_items[k] + try: + result.lazy_items[k_copy] = deepcopy(lazy_item, memo) + except TypeError: + # If deepcopy fails for a lazy singleton, try to + # evaluate the singleton and deepcopy the result. + if not isinstance(lazy_item[0], self._SingletonWrapper): + raise + dict.__setitem__(result, k_copy, deepcopy(self[k], memo)) + else: + dict.__setitem__(result, k_copy, None) else: dict.__setitem__(result, k_copy, deepcopy(self[k], memo)) return result |