weakref.py revision 80ce6dd5642025f5cdf0ba5556f08df0803f5636
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
4541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def __getitem__(self, key):
464fd06e0170aa75e4873b73f733bfd3f3de19d967Fred Drake        o = self.data[key]()
4741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        if o is None:
4841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            raise KeyError, key
4941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        else:
5041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            return o
5141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
5241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def __repr__(self):
539d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        return "<WeakValueDictionary at %s>" % id(self)
5441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
5541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def __setitem__(self, key, value):
56746fe0fae5442403c64be34b87609601166e97c8Fred Drake        self.data[key] = ref(value, self.__makeremove(key))
5741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
5841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def copy(self):
599d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        new = WeakValueDictionary()
60bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for key, wr in self.data.items():
61bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
6241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
6341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                new[key] = o
649d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        return new
6541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
661d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def get(self, key, default=None):
6741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        try:
68bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            wr = self.data[key]
6941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        except KeyError:
7041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            return default
7141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        else:
72bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
7341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is None:
7441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                # This should only happen
7541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                return default
7641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            else:
7741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                return o
7841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
7941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def items(self):
80312a5dc539b583abcbbf006942a4ceead9b9172bFred Drake        L = []
81bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for key, wr in self.data.items():
82bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
8341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
84312a5dc539b583abcbbf006942a4ceead9b9172bFred Drake                L.append((key, o))
8541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        return L
8641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
87101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iteritems(self):
88101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return WeakValuedItemIterator(self)
89101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
90101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iterkeys(self):
91101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return self.data.iterkeys()
92101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    __iter__ = iterkeys
93101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
94101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def itervalues(self):
95101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return WeakValuedValueIterator(self)
96101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
9741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def popitem(self):
9841deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        while 1:
99bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            key, wr = self.data.popitem()
100bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
10141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
10241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                return key, o
10341deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
1042c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger    def pop(self, key, *args):
1052c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger        try:
1062c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger            o = self.data.pop(key)()
1072c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger        except KeyError:
1082c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger            if args:
1092c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger                return args[0]
1102c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger            raise
1112c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger        if o is None:
1122c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger            raise KeyError, key
1132c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger        else:
1142c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger            return o
1152c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger
11680ce6dd5642025f5cdf0ba5556f08df0803f5636Walter Dörwald    def setdefault(self, key, default=None):
11741deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        try:
118bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            wr = self.data[key]
11941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        except KeyError:
120746fe0fae5442403c64be34b87609601166e97c8Fred Drake            self.data[key] = ref(default, self.__makeremove(key))
12141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            return default
12241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        else:
123bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            return wr()
12441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
12531017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger    def update(self, dict=None, **kwargs):
12641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        d = self.data
12731017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger        if dict is not None:
12831017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            if not hasattr(dict, "items"):
12931017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger                dict = type({})(dict)
13031017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            for key, o in dict.items():
13131017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger                d[key] = ref(o, self.__makeremove(key))
13231017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger        if len(kwargs):
13331017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            self.update(kwargs)
13441deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
13541deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake    def values(self):
13641deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        L = []
137bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for wr in self.data.values():
138bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
13941deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake            if o is not None:
14041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake                L.append(o)
14141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake        return L
14241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
143746fe0fae5442403c64be34b87609601166e97c8Fred Drake    def __makeremove(self, key):
144746fe0fae5442403c64be34b87609601166e97c8Fred Drake        def remove(o, selfref=ref(self), key=key):
145746fe0fae5442403c64be34b87609601166e97c8Fred Drake            self = selfref()
146746fe0fae5442403c64be34b87609601166e97c8Fred Drake            if self is not None:
147746fe0fae5442403c64be34b87609601166e97c8Fred Drake                del self.data[key]
148746fe0fae5442403c64be34b87609601166e97c8Fred Drake        return remove
149746fe0fae5442403c64be34b87609601166e97c8Fred Drake
15041deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake
1515e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwisclass WeakKeyDictionary(UserDict.UserDict):
152bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    """ Mapping class that references keys weakly.
153bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake
154bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    Entries in the dictionary will be discarded when there is no
155bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    longer a strong reference to the key. This can be used to
156bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    associate additional data with an object owned by other parts of
157bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    an application without adding attributes to those objects. This
158bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    can be especially useful with objects that override attribute
159bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    accesses.
160bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake    """
1615e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1625e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __init__(self, dict=None):
1635e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        self.data = {}
164746fe0fae5442403c64be34b87609601166e97c8Fred Drake        def remove(k, selfref=ref(self)):
165746fe0fae5442403c64be34b87609601166e97c8Fred Drake            self = selfref()
166746fe0fae5442403c64be34b87609601166e97c8Fred Drake            if self is not None:
167746fe0fae5442403c64be34b87609601166e97c8Fred Drake                del self.data[k]
1685e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        self._remove = remove
169009afb7c90882ee83e196b62b1555067e14fd950Guido van Rossum        if dict is not None: self.update(dict)
1705e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
171b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake    def __delitem__(self, key):
172886128f4f8b30b7e3623418eab063a3a8dd3495cTim Peters        del self.data[ref(key)]
173b663a2ccbdd9bbd9a13f0cea743af709c53ec0c1Fred Drake
1745e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __getitem__(self, key):
1755e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return self.data[ref(key)]
1765e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1775e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __repr__(self):
1785e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return "<WeakKeyDictionary at %s>" % id(self)
1795e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1805e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def __setitem__(self, key, value):
1815e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        self.data[ref(key, self._remove)] = value
1825e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1835e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def copy(self):
1845e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        new = WeakKeyDictionary()
1855e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        for key, value in self.data.items():
1865e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            o = key()
1875e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            if o is not None:
1885e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis                new[o] = value
1899d2c85dec7262475b83d45fdb53651c9c069e1cbFred Drake        return new
1905e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1911d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def get(self, key, default=None):
1925e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return self.data.get(ref(key),default)
1935e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
1941d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def has_key(self, key):
1953bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake        try:
1963bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake            wr = ref(key)
1973bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake        except TypeError:
1983bae7ddf8e63889b185235f85a6695bc05d59059Fred Drake            return 0
19954f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger        return wr in self.data
2001d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake
20154f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger    def __contains__(self, key):
20254f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger        try:
20354f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger            wr = ref(key)
20454f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger        except TypeError:
20554f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger            return 0
20654f0222547b1e92cd018ef132307a6f793dc9505Raymond Hettinger        return wr in self.data
207c411dbaeee29dba87d5432a92fe76ea65d8e25f0Tim Peters
2085e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def items(self):
2095e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        L = []
2105e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        for key, value in self.data.items():
2115e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            o = key()
2125e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            if o is not None:
2135e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis                L.append((o, value))
2145e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return L
2155e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
216101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iteritems(self):
217101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return WeakKeyedItemIterator(self)
218101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
219101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def iterkeys(self):
220101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return WeakKeyedKeyIterator(self)
221101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    __iter__ = iterkeys
222101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
223101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def itervalues(self):
224101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return self.data.itervalues()
225101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
2261d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake    def keys(self):
2271d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake        L = []
228bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake        for wr in self.data.keys():
229bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake            o = wr()
2301d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake            if o is not None:
2311d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake                L.append(o)
2321d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake        return L
2331d9e4b7de3d15007d5b9e7ac4b38f5e158d3c840Fred Drake
2345e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis    def popitem(self):
2355e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        while 1:
2365e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            key, value = self.data.popitem()
2375e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            o = key()
2385e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis            if o is not None:
2395e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis                return o, value
2405e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
2412c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger    def pop(self, key, *args):
2422c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger        return self.data.pop(ref(key), *args)
2432c2d322884ee72077a256ec3cd0aa9ce3580eedcRaymond Hettinger
24480ce6dd5642025f5cdf0ba5556f08df0803f5636Walter Dörwald    def setdefault(self, key, default=None):
2455e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        return self.data.setdefault(ref(key, self._remove),default)
2465e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
24731017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger    def update(self, dict=None, **kwargs):
2485e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis        d = self.data
24931017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger        if dict is not None:
25031017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            if not hasattr(dict, "items"):
25131017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger                dict = type({})(dict)
25231017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            for key, value in dict.items():
25331017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger                d[ref(key, self._remove)] = value
25431017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger        if len(kwargs):
25531017aed36a5c5b0e4b16ca58bea09c9ce360134Raymond Hettinger            self.update(kwargs)
256bd7f818c508248e12f88e51198cb5e9b861dacbfFred Drake
2575e1633365d8a48e96dd4f42c4e7c8729bc62c26dMartin v. Löwis
258101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass BaseIter:
259101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def __iter__(self):
260101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        return self
261101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
262101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
263101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakKeyedKeyIterator(BaseIter):
264101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def __init__(self, weakdict):
265101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        self._next = weakdict.data.iterkeys().next
266101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
267101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def next(self):
268101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        while 1:
269101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            wr = self._next()
270101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            obj = wr()
271101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            if obj is not None:
272101209d44ce063cd04fd6793d94991f8e6688428Fred Drake                return obj
273101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
274101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
275101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakKeyedItemIterator(BaseIter):
276101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def __init__(self, weakdict):
277101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        self._next = weakdict.data.iteritems().next
278101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
279101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def next(self):
280101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        while 1:
281101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            wr, value = self._next()
282101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            key = wr()
283101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            if key is not None:
284101209d44ce063cd04fd6793d94991f8e6688428Fred Drake                return key, value
285101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
286101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
287101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakValuedValueIterator(BaseIter):
288101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def __init__(self, weakdict):
289101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        self._next = weakdict.data.itervalues().next
290101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
291101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def next(self):
292101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        while 1:
293101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            wr = self._next()
294101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            obj = wr()
295101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            if obj is not None:
296101209d44ce063cd04fd6793d94991f8e6688428Fred Drake                return obj
297101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
298101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
299101209d44ce063cd04fd6793d94991f8e6688428Fred Drakeclass WeakValuedItemIterator(BaseIter):
300101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def __init__(self, weakdict):
301101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        self._next = weakdict.data.iteritems().next
302101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
303101209d44ce063cd04fd6793d94991f8e6688428Fred Drake    def next(self):
304101209d44ce063cd04fd6793d94991f8e6688428Fred Drake        while 1:
305101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            key, wr = self._next()
306101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            value = wr()
307101209d44ce063cd04fd6793d94991f8e6688428Fred Drake            if value is not None:
308101209d44ce063cd04fd6793d94991f8e6688428Fred Drake                return key, value
309101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
310101209d44ce063cd04fd6793d94991f8e6688428Fred Drake
31141deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drake# no longer needed
31241deb1efc2f969b58e49af669cc20d15ccdb04c6Fred Drakedel UserDict
313