weakref.py revision 61146790992e0a00b76a6bf6ecc9e53289a1ecd7
141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake"""Weak reference support for Python.
241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred DrakeThis module is an implementation of PEP 205:
441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drakehttp://python.sourceforge.net/peps/pep-0205.html
641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake"""
741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
8bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake# Naming convention: Variables named "wr" are weak reference objects;
9bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake# they are called this instead of "ref" to avoid name collisions with
10bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake# the module-global ref() function imported from _weakref.
11bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake
1241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drakeimport UserDict
1341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
1441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drakefrom _weakref import \
1541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     getweakrefcount, \
1641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     getweakrefs, \
1741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     ref, \
1841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     proxy, \
1941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     CallableProxyType, \
2041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     ProxyType, \
2141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake     ReferenceType
2241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
23e029242d5cfb8a3879bdc7324db4449e6a8451cfFred Drakefrom exceptions import ReferenceError
24e029242d5cfb8a3879bdc7324db4449e6a8451cfFred Drake
25e029242d5cfb8a3879bdc7324db4449e6a8451cfFred Drake
2641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred DrakeProxyTypes = (ProxyType, CallableProxyType)
2741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
289a9d219f07656a9f1eb6f8beb2a9e2ee462b77f8Fred Drake__all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs",
2940fc16059f04ee8fda0b5956cc4883eb21ca8f8cSkip Montanaro           "WeakKeyDictionary", "ReferenceType", "ProxyType",
3040fc16059f04ee8fda0b5956cc4883eb21ca8f8cSkip Montanaro           "CallableProxyType", "ProxyTypes", "WeakValueDictionary"]
3141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
32bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake
335e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwisclass WeakValueDictionary(UserDict.UserDict):
34bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    """Mapping class that references values weakly.
3541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
36bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    Entries in the dictionary will be discarded when no strong
37bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    reference to the value exists anymore
38bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    """
3941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    # We inherit the constructor without worrying about the input
4041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    # dictionary; since it uses our .update() method, we get the right
419d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake    # checks (if the other dictionary is a WeakValueDictionary,
429d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake    # objects are unwrapped on the way out, and we always wrap on the
439d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake    # way in).
4441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
450a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake    def __init__(self, *args, **kw):
460a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake        UserDict.UserDict.__init__(self, *args, **kw)
470a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake        def remove(wr, selfref=ref(self)):
480a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake            self = selfref()
490a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake            if self is not None:
500a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake                del self.data[wr.key]
510a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake        self._remove = remove
520a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake
5341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def __getitem__(self, key):
544fd06e0170aa75e4873b73f733bfd3f3de19d967Fred Drake        o = self.data[key]()
5541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        if o is None:
5641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            raise KeyError, key
5741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        else:
5841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            return o
5941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
6061146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger    def __contains__(self, key):
6161146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        try:
6261146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            o = self.data[key]()
6361146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        except KeyError:
6461146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            return False
6561146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        return o is not None
6661146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger
6761146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger    def has_key(self, key):
6861146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        try:
6961146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            o = self.data[key]()
7061146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        except KeyError:
7161146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            return False
7261146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        return o is not None
7361146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger
7441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def __repr__(self):
759d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        return "<WeakValueDictionary at %s>" % id(self)
7641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
7741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def __setitem__(self, key, value):
780a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake        self.data[key] = KeyedRef(value, self._remove, key)
7941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
8041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def copy(self):
819d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        new = WeakValueDictionary()
82bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for key, wr in self.data.items():
83bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
8441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
8541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                new[key] = o
869d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        return new
8741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
881d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def get(self, key, default=None):
8941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        try:
90bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            wr = self.data[key]
9141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        except KeyError:
9241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            return default
9341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        else:
94bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
9541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is None:
9641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                # This should only happen
9741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                return default
9841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            else:
9941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                return o
10041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
10141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def items(self):
102312a5dc539b583abcbbf006942a4ceead9b9172bFred Drake        L = []
103bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for key, wr in self.data.items():
104bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
10541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
106312a5dc539b583abcbbf006942a4ceead9b9172bFred Drake                L.append((key, o))
10741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        return L
10841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
109101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iteritems(self):
11061146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        for wr in self.data.itervalues():
11161146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            value = wr()
11261146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            if value is not None:
11361146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger                yield wr.key, value
114101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
115101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iterkeys(self):
116101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return self.data.iterkeys()
11761146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger
11861146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger    def __iter__(self):
11961146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        return self.data.iterkeys()
120101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
121101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def itervalues(self):
12261146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        for wr in self.data.itervalues():
12361146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            obj = wr()
12461146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            if obj is not None:
12561146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger                yield obj
126101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
12741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def popitem(self):
12841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        while 1:
129bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            key, wr = self.data.popitem()
130bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
13141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
13241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                return key, o
13341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
1342c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger    def pop(self, key, *args):
1352c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger        try:
1362c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger            o = self.data.pop(key)()
1372c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger        except KeyError:
1382c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger            if args:
1392c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger                return args[0]
1402c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger            raise
1412c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger        if o is None:
1422c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger            raise KeyError, key
1432c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger        else:
1442c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger            return o
1452c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger
14680ce6dd5642025f5cdf0ba5556f08df0803f5636Walter Dörwald    def setdefault(self, key, default=None):
14741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        try:
148bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            wr = self.data[key]
14941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        except KeyError:
1500a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake            self.data[key] = KeyedRef(default, self._remove, key)
15141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            return default
15241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        else:
153bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            return wr()
15441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
15531017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger    def update(self, dict=None, **kwargs):
15641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        d = self.data
15731017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger        if dict is not None:
15831017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            if not hasattr(dict, "items"):
15931017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger                dict = type({})(dict)
16031017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            for key, o in dict.items():
1610a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake                d[key] = KeyedRef(o, self._remove, key)
16231017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger        if len(kwargs):
16331017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            self.update(kwargs)
16441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
16541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def values(self):
16641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        L = []
167bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for wr in self.data.values():
168bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
16941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
17041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                L.append(o)
17141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        return L
17241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
1730a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake
1740a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drakeclass KeyedRef(ref):
1750a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake    """Specialized reference that includes a key corresponding to the value.
1760a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake
1770a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake    This is used in the WeakValueDictionary to avoid having to create
1780a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake    a function object for each key stored in the mapping.  A shared
1790a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake    callback object can use the 'key' attribute of a KeyedRef instead
1800a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake    of getting a reference to the key from an enclosing scope.
1810a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake
1820a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake    """
1830a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake
1840a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake    __slots__ = "key",
1850a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake
1860a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake    def __new__(type, ob, callback, key):
1870a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake        self = ref.__new__(type, ob, callback)
1880a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake        self.key = key
1890a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake        return self
1900a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake
1910a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake    def __init__(self, ob, callback, key):
1920a4dd390bf653128de8bc2e99da64967c8cdf86eFred Drake        super(KeyedRef,  self).__init__(ob, callback)
193746fe0fae5442403c64be34b87609601166e97c8Fred Drake
19441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
1955e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwisclass WeakKeyDictionary(UserDict.UserDict):
196bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    """ Mapping class that references keys weakly.
197bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake
198bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    Entries in the dictionary will be discarded when there is no
199bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    longer a strong reference to the key. This can be used to
200bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    associate additional data with an object owned by other parts of
201bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    an application without adding attributes to those objects. This
202bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    can be especially useful with objects that override attribute
203bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    accesses.
204bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    """
2055e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
2065e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __init__(self, dict=None):
2075e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        self.data = {}
208746fe0fae5442403c64be34b87609601166e97c8Fred Drake        def remove(k, selfref=ref(self)):
209746fe0fae5442403c64be34b87609601166e97c8Fred Drake            self = selfref()
210746fe0fae5442403c64be34b87609601166e97c8Fred Drake            if self is not None:
211746fe0fae5442403c64be34b87609601166e97c8Fred Drake                del self.data[k]
2125e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        self._remove = remove
213009afb7c90882ee83e196b62b1555067e14fd950Guido van Rossum        if dict is not None: self.update(dict)
2145e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
215b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake    def __delitem__(self, key):
216886128f4f8b30b7e3623418eab063a3a8dd3495cTim Peters        del self.data[ref(key)]
217b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake
2185e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __getitem__(self, key):
2195e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return self.data[ref(key)]
2205e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
2215e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __repr__(self):
2225e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return "<WeakKeyDictionary at %s>" % id(self)
2235e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
2245e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __setitem__(self, key, value):
2255e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        self.data[ref(key, self._remove)] = value
2265e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
2275e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def copy(self):
2285e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        new = WeakKeyDictionary()
2295e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        for key, value in self.data.items():
2305e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            o = key()
2315e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            if o is not None:
2325e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis                new[o] = value
2339d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        return new
2345e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
2351d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def get(self, key, default=None):
2365e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return self.data.get(ref(key),default)
2375e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
2381d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def has_key(self, key):
2393bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake        try:
2403bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake            wr = ref(key)
2413bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake        except TypeError:
2423bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake            return 0
24354f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger        return wr in self.data
2441d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake
24554f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger    def __contains__(self, key):
24654f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger        try:
24754f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger            wr = ref(key)
24854f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger        except TypeError:
24954f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger            return 0
25054f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger        return wr in self.data
251c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters
2525e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def items(self):
2535e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        L = []
2545e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        for key, value in self.data.items():
2555e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            o = key()
2565e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            if o is not None:
2575e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis                L.append((o, value))
2585e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return L
2595e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
260101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iteritems(self):
26161146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        for wr, value in self.data.iteritems():
26261146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            key = wr()
26361146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            if key is not None:
26461146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger                yield key, value
265101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
266101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iterkeys(self):
26761146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        for wr in self.data.iterkeys():
26861146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            obj = wr()
26961146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger            if obj is not None:
27061146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger                yield obj
27161146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger
27261146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger    def __iter__(self):
27361146790992e0a00b76a6bf6ecc9e53289a1ecd7Raymond Hettinger        return self.iterkeys()
274101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
275101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def itervalues(self):
276101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return self.data.itervalues()
277101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
2781d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def keys(self):
2791d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake        L = []
280bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for wr in self.data.keys():
281bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
2821d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake            if o is not None:
2831d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake                L.append(o)
2841d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake        return L
2851d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake
2865e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def popitem(self):
2875e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        while 1:
2885e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            key, value = self.data.popitem()
2895e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            o = key()
2905e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            if o is not None:
2915e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis                return o, value
2925e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
2932c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger    def pop(self, key, *args):
2942c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger        return self.data.pop(ref(key), *args)
2952c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger
29680ce6dd5642025f5cdf0ba5556f08df0803f5636Walter Dörwald    def setdefault(self, key, default=None):
2975e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return self.data.setdefault(ref(key, self._remove),default)
2985e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
29931017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger    def update(self, dict=None, **kwargs):
3005e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        d = self.data
30131017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger        if dict is not None:
30231017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            if not hasattr(dict, "items"):
30331017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger                dict = type({})(dict)
30431017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            for key, value in dict.items():
30531017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger                d[ref(key, self._remove)] = value
30631017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger        if len(kwargs):
30731017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            self.update(kwargs)
308