File: C:/Users/fred/anaconda3/Lib/site-packages/tables/misc/proxydict.py
"""Proxy dictionary for objects stored in a container."""
import weakref
class ProxyDict(dict):
"""A dictionary which uses a container object to store its values."""
def __init__(self, container):
self.containerref = weakref.ref(container)
"""A weak reference to the container object.
.. versionchanged:: 3.0
The *containerRef* attribute has been renamed into
*containerref*.
"""
def __getitem__(self, key):
if key not in self:
raise KeyError(key)
# Values are not actually stored to avoid extra references.
return self._get_value_from_container(self._get_container(), key)
def __setitem__(self, key, value):
# Values are not actually stored to avoid extra references.
super().__setitem__(key, None)
def __repr__(self):
return object.__repr__(self)
def __str__(self):
# C implementation does not use `self.__getitem__()`. :(
return '{' + ", ".join("{k!r}: {v!r}" for k, v in self.items()) + '}'
def values(self):
# C implementation does not use `self.__getitem__()`. :(
return [self[key] for key in self.keys()]
def itervalues(self):
# C implementation does not use `self.__getitem__()`. :(
for key in self.keys():
yield self[key]
def items(self):
# C implementation does not use `self.__getitem__()`. :(
return [(key, self[key]) for key in self.keys()]
def iteritems(self):
# C implementation does not use `self.__getitem__()`. :(
for key in self.keys():
yield (key, self[key])
def _get_container(self):
container = self.containerref()
if container is None:
raise ValueError("the container object does no longer exist")
return container