summaryrefslogtreecommitdiff
path: root/src/zope/interface/registry.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/zope/interface/registry.py')
-rw-r--r--src/zope/interface/registry.py29
1 files changed, 16 insertions, 13 deletions
diff --git a/src/zope/interface/registry.py b/src/zope/interface/registry.py
index 26855ca..bba0267 100644
--- a/src/zope/interface/registry.py
+++ b/src/zope/interface/registry.py
@@ -67,12 +67,14 @@ class _UnhashableComponentCounter(object):
return
raise KeyError(component) # pragma: no cover
+def _defaultdict_int():
+ return defaultdict(int)
class _UtilityRegistrations(object):
def __init__(self, utilities, utility_registrations):
# {provided -> {component: count}}
- self._cache = defaultdict(lambda: defaultdict(int))
+ self._cache = defaultdict(_defaultdict_int)
self._utilities = utilities
self._utility_registrations = utility_registrations
@@ -138,18 +140,17 @@ class _UtilityRegistrations(object):
@implementer(IComponents)
class Components(object):
+ _v_utility_registrations_cache = None
+
def __init__(self, name='', bases=()):
+ # __init__ is used for test cleanup as well as initialization.
+ # XXX add a separate API for test cleanup.
assert isinstance(name, STRING_TYPES)
self.__name__ = name
self._init_registries()
self._init_registrations()
self.__bases__ = tuple(bases)
-
- # __init__ is used for test cleanup as well as initialization.
- # XXX add a separate API for test cleanup.
- # See _utility_registrations below.
- if hasattr(self, '_v_utility_registrations_cache'):
- del self._v_utility_registrations_cache
+ self._v_utility_registrations_cache = None
def __repr__(self):
return "<%s %s>" % (self.__class__.__name__, self.__name__)
@@ -185,12 +186,14 @@ class Components(object):
def _utility_registrations_cache(self):
# We use a _v_ attribute internally so that data aren't saved in ZODB,
# because this object cannot be pickled.
- try:
- return self._v_utility_registrations_cache
- except AttributeError:
- self._v_utility_registrations_cache = _UtilityRegistrations(
- self.utilities, self._utility_registrations)
- return self._v_utility_registrations_cache
+ cache = self._v_utility_registrations_cache
+ if (cache is None
+ or cache._utilities is not self.utilities
+ or cache._utility_registrations is not self._utility_registrations):
+ cache = self._v_utility_registrations_cache = _UtilityRegistrations(
+ self.utilities,
+ self._utility_registrations)
+ return cache
def _getBases(self):
# Subclasses might override