annotate Lib/weakref.py @ 39042:c02fa187e0f4 legacy-trunk

Part of SF patch #1484695. This removes dead code. The chksum was already verified in .frombuf() on the lines above. If there was a problem an exception is raised, so there was no way this condition could have been true.
author Neal Norwitz <nnorwitz@gmail.com>
date Mon, 10 Jul 2006 00:23:17 +0000
parents 728c16f16267
children 47233a17e970 63237fcefd99
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
1 """Weak reference support for Python.
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
2
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
3 This module is an implementation of PEP 205:
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
4
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
5 http://python.sourceforge.net/peps/pep-0205.html
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
6 """
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
7
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
8 # Naming convention: Variables named "wr" are weak reference objects;
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
9 # they are called this instead of "ref" to avoid name collisions with
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
10 # the module-global ref() function imported from _weakref.
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
11
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
12 import UserDict
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
13
33356
e56192e9fd7e Use multi-line import
Andrew M. Kuchling <amk@amk.ca>
parents: 33197
diff changeset
14 from _weakref import (
e56192e9fd7e Use multi-line import
Andrew M. Kuchling <amk@amk.ca>
parents: 33197
diff changeset
15 getweakrefcount,
e56192e9fd7e Use multi-line import
Andrew M. Kuchling <amk@amk.ca>
parents: 33197
diff changeset
16 getweakrefs,
e56192e9fd7e Use multi-line import
Andrew M. Kuchling <amk@amk.ca>
parents: 33197
diff changeset
17 ref,
e56192e9fd7e Use multi-line import
Andrew M. Kuchling <amk@amk.ca>
parents: 33197
diff changeset
18 proxy,
e56192e9fd7e Use multi-line import
Andrew M. Kuchling <amk@amk.ca>
parents: 33197
diff changeset
19 CallableProxyType,
e56192e9fd7e Use multi-line import
Andrew M. Kuchling <amk@amk.ca>
parents: 33197
diff changeset
20 ProxyType,
e56192e9fd7e Use multi-line import
Andrew M. Kuchling <amk@amk.ca>
parents: 33197
diff changeset
21 ReferenceType)
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
22
20281
380d4b4ee602 ReferenceError is now built-in, so pick it up from the right place.
Fred Drake <fdrake@acm.org>
parents: 20155
diff changeset
23 from exceptions import ReferenceError
380d4b4ee602 ReferenceError is now built-in, so pick it up from the right place.
Fred Drake <fdrake@acm.org>
parents: 20155
diff changeset
24
380d4b4ee602 ReferenceError is now built-in, so pick it up from the right place.
Fred Drake <fdrake@acm.org>
parents: 20155
diff changeset
25
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
26 ProxyTypes = (ProxyType, CallableProxyType)
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
27
17386
bbcc9837312e mapping(): Remove this function since it does not add anything to the API.
Fred Drake <fdrake@acm.org>
parents: 16889
diff changeset
28 __all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs",
16889
0feb63490093 final round of __all__ lists (I hope) - skipped urllib2 because Moshe may be
Skip Montanaro <skip@pobox.com>
parents: 16884
diff changeset
29 "WeakKeyDictionary", "ReferenceType", "ProxyType",
0feb63490093 final round of __all__ lists (I hope) - skipped urllib2 because Moshe may be
Skip Montanaro <skip@pobox.com>
parents: 16884
diff changeset
30 "CallableProxyType", "ProxyTypes", "WeakValueDictionary"]
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
31
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
32
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
33 class WeakValueDictionary(UserDict.UserDict):
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
34 """Mapping class that references values weakly.
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
35
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
36 Entries in the dictionary will be discarded when no strong
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
37 reference to the value exists anymore
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
38 """
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
39 # We inherit the constructor without worrying about the input
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
40 # dictionary; since it uses our .update() method, we get the right
16884
1ce751fa67d8 Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents: 16794
diff changeset
41 # checks (if the other dictionary is a WeakValueDictionary,
1ce751fa67d8 Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents: 16794
diff changeset
42 # objects are unwrapped on the way out, and we always wrap on the
1ce751fa67d8 Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents: 16794
diff changeset
43 # way in).
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
44
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
45 def __init__(self, *args, **kw):
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
46 def remove(wr, selfref=ref(self)):
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
47 self = selfref()
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
48 if self is not None:
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
49 del self.data[wr.key]
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
50 self._remove = remove
35018
40f7e1da1bdf Backport bug #1196315: fix weakref.WeakValueDictionary constructor.
Georg Brandl <georg@python.org>
parents: 33356
diff changeset
51 UserDict.UserDict.__init__(self, *args, **kw)
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
52
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
53 def __getitem__(self, key):
18952
e90a658a58d4 Make sure that WeakValueDictionary[] raises KeyError instead of TypeError
Fred Drake <fdrake@acm.org>
parents: 17650
diff changeset
54 o = self.data[key]()
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
55 if o is None:
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
56 raise KeyError, key
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
57 else:
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
58 return o
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
59
33197
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
60 def __contains__(self, key):
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
61 try:
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
62 o = self.data[key]()
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
63 except KeyError:
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
64 return False
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
65 return o is not None
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
66
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
67 def has_key(self, key):
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
68 try:
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
69 o = self.data[key]()
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
70 except KeyError:
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
71 return False
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
72 return o is not None
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
73
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
74 def __repr__(self):
16884
1ce751fa67d8 Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents: 16794
diff changeset
75 return "<WeakValueDictionary at %s>" % id(self)
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
76
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
77 def __setitem__(self, key, value):
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
78 self.data[key] = KeyedRef(value, self._remove, key)
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
79
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
80 def copy(self):
16884
1ce751fa67d8 Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents: 16794
diff changeset
81 new = WeakValueDictionary()
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
82 for key, wr in self.data.items():
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
83 o = wr()
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
84 if o is not None:
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
85 new[key] = o
16884
1ce751fa67d8 Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents: 16794
diff changeset
86 return new
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
87
17546
da5eab33147b Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents: 17386
diff changeset
88 def get(self, key, default=None):
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
89 try:
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
90 wr = self.data[key]
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
91 except KeyError:
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
92 return default
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
93 else:
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
94 o = wr()
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
95 if o is None:
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
96 # This should only happen
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
97 return default
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
98 else:
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
99 return o
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
100
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
101 def items(self):
16417
901b94656928 WeakDictionary.items(): Do not allow (key,ref) pairs to leak out for
Fred Drake <fdrake@acm.org>
parents: 16385
diff changeset
102 L = []
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
103 for key, wr in self.data.items():
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
104 o = wr()
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
105 if o is not None:
16417
901b94656928 WeakDictionary.items(): Do not allow (key,ref) pairs to leak out for
Fred Drake <fdrake@acm.org>
parents: 16385
diff changeset
106 L.append((key, o))
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
107 return L
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
108
17650
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
109 def iteritems(self):
33197
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
110 for wr in self.data.itervalues():
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
111 value = wr()
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
112 if value is not None:
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
113 yield wr.key, value
17650
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
114
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
115 def iterkeys(self):
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
116 return self.data.iterkeys()
33197
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
117
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
118 def __iter__(self):
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
119 return self.data.iterkeys()
17650
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
120
38079
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
121 def itervaluerefs(self):
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
122 """Return an iterator that yields the weak references to the values.
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
123
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
124 The references are not guaranteed to be 'live' at the time
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
125 they are used, so the result of calling the references needs
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
126 to be checked before being used. This can be used to avoid
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
127 creating references that will cause the garbage collector to
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
128 keep the values around longer than needed.
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
129
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
130 """
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
131 return self.data.itervalues()
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
132
17650
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
133 def itervalues(self):
33197
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
134 for wr in self.data.itervalues():
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
135 obj = wr()
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
136 if obj is not None:
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
137 yield obj
17650
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
138
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
139 def popitem(self):
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
140 while 1:
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
141 key, wr = self.data.popitem()
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
142 o = wr()
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
143 if o is not None:
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
144 return key, o
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
145
28240
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
146 def pop(self, key, *args):
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
147 try:
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
148 o = self.data.pop(key)()
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
149 except KeyError:
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
150 if args:
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
151 return args[0]
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
152 raise
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
153 if o is None:
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
154 raise KeyError, key
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
155 else:
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
156 return o
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
157
32155
efb84ed7377d The default argument in dict.setdefault() defaults to None.
Walter Dörwald <walter@livinglogic.de>
parents: 31616
diff changeset
158 def setdefault(self, key, default=None):
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
159 try:
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
160 wr = self.data[key]
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
161 except KeyError:
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
162 self.data[key] = KeyedRef(default, self._remove, key)
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
163 return default
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
164 else:
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
165 return wr()
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
166
31616
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
167 def update(self, dict=None, **kwargs):
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
168 d = self.data
31616
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
169 if dict is not None:
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
170 if not hasattr(dict, "items"):
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
171 dict = type({})(dict)
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
172 for key, o in dict.items():
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
173 d[key] = KeyedRef(o, self._remove, key)
31616
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
174 if len(kwargs):
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
175 self.update(kwargs)
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
176
38079
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
177 def valuerefs(self):
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
178 """Return a list of weak references to the values.
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
179
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
180 The references are not guaranteed to be 'live' at the time
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
181 they are used, so the result of calling the references needs
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
182 to be checked before being used. This can be used to avoid
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
183 creating references that will cause the garbage collector to
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
184 keep the values around longer than needed.
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
185
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
186 """
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
187 return self.data.values()
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
188
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
189 def values(self):
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
190 L = []
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
191 for wr in self.data.values():
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
192 o = wr()
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
193 if o is not None:
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
194 L.append(o)
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
195 return L
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
196
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
197
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
198 class KeyedRef(ref):
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
199 """Specialized reference that includes a key corresponding to the value.
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
200
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
201 This is used in the WeakValueDictionary to avoid having to create
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
202 a function object for each key stored in the mapping. A shared
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
203 callback object can use the 'key' attribute of a KeyedRef instead
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
204 of getting a reference to the key from an enclosing scope.
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
205
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
206 """
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
207
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
208 __slots__ = "key",
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
209
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
210 def __new__(type, ob, callback, key):
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
211 self = ref.__new__(type, ob, callback)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
212 self.key = key
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
213 return self
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
214
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
215 def __init__(self, ob, callback, key):
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32155
diff changeset
216 super(KeyedRef, self).__init__(ob, callback)
20155
bbb353d31e25 Clean up circular references in the Weak*Dictionary classes; this avoids
Fred Drake <fdrake@acm.org>
parents: 19763
diff changeset
217
16385
1fb6672b20ef PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
218
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
219 class WeakKeyDictionary(UserDict.UserDict):
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
220 """ Mapping class that references keys weakly.
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
221
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
222 Entries in the dictionary will be discarded when there is no
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
223 longer a strong reference to the key. This can be used to
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
224 associate additional data with an object owned by other parts of
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
225 an application without adding attributes to those objects. This
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
226 can be especially useful with objects that override attribute
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
227 accesses.
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
228 """
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
229
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
230 def __init__(self, dict=None):
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
231 self.data = {}
20155
bbb353d31e25 Clean up circular references in the Weak*Dictionary classes; this avoids
Fred Drake <fdrake@acm.org>
parents: 19763
diff changeset
232 def remove(k, selfref=ref(self)):
bbb353d31e25 Clean up circular references in the Weak*Dictionary classes; this avoids
Fred Drake <fdrake@acm.org>
parents: 19763
diff changeset
233 self = selfref()
bbb353d31e25 Clean up circular references in the Weak*Dictionary classes; this avoids
Fred Drake <fdrake@acm.org>
parents: 19763
diff changeset
234 if self is not None:
bbb353d31e25 Clean up circular references in the Weak*Dictionary classes; this avoids
Fred Drake <fdrake@acm.org>
parents: 19763
diff changeset
235 del self.data[k]
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
236 self._remove = remove
23764
d58fb5445118 SF patch 564549 (Erik Andersén).
Guido van Rossum <guido@python.org>
parents: 23620
diff changeset
237 if dict is not None: self.update(dict)
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
238
19763
94d0f2eea047 Add __delitem__() support for WeakKeyDictionary.
Fred Drake <fdrake@acm.org>
parents: 18952
diff changeset
239 def __delitem__(self, key):
29257
dea38116c373 SF 742860: WeakKeyDictionary __delitem__ uses iterkeys
Tim Peters <tim.peters@gmail.com>
parents: 28240
diff changeset
240 del self.data[ref(key)]
19763
94d0f2eea047 Add __delitem__() support for WeakKeyDictionary.
Fred Drake <fdrake@acm.org>
parents: 18952
diff changeset
241
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
242 def __getitem__(self, key):
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
243 return self.data[ref(key)]
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
244
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
245 def __repr__(self):
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
246 return "<WeakKeyDictionary at %s>" % id(self)
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
247
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
248 def __setitem__(self, key, value):
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
249 self.data[ref(key, self._remove)] = value
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
250
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
251 def copy(self):
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
252 new = WeakKeyDictionary()
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
253 for key, value in self.data.items():
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
254 o = key()
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
255 if o is not None:
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
256 new[o] = value
16884
1ce751fa67d8 Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents: 16794
diff changeset
257 return new
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
258
17546
da5eab33147b Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents: 17386
diff changeset
259 def get(self, key, default=None):
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
260 return self.data.get(ref(key),default)
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
261
17546
da5eab33147b Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents: 17386
diff changeset
262 def has_key(self, key):
20902
d3f3d21ac04b WeakKeyDictionary.has_key(): If the key being tested is not weakly
Fred Drake <fdrake@acm.org>
parents: 20281
diff changeset
263 try:
d3f3d21ac04b WeakKeyDictionary.has_key(): If the key being tested is not weakly
Fred Drake <fdrake@acm.org>
parents: 20281
diff changeset
264 wr = ref(key)
d3f3d21ac04b WeakKeyDictionary.has_key(): If the key being tested is not weakly
Fred Drake <fdrake@acm.org>
parents: 20281
diff changeset
265 except TypeError:
d3f3d21ac04b WeakKeyDictionary.has_key(): If the key being tested is not weakly
Fred Drake <fdrake@acm.org>
parents: 20281
diff changeset
266 return 0
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 20902
diff changeset
267 return wr in self.data
17546
da5eab33147b Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents: 17386
diff changeset
268
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 20902
diff changeset
269 def __contains__(self, key):
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 20902
diff changeset
270 try:
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 20902
diff changeset
271 wr = ref(key)
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 20902
diff changeset
272 except TypeError:
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 20902
diff changeset
273 return 0
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 20902
diff changeset
274 return wr in self.data
24263
e6033254df21 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 23764
diff changeset
275
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
276 def items(self):
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
277 L = []
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
278 for key, value in self.data.items():
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
279 o = key()
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
280 if o is not None:
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
281 L.append((o, value))
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
282 return L
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
283
17650
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
284 def iteritems(self):
33197
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
285 for wr, value in self.data.iteritems():
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
286 key = wr()
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
287 if key is not None:
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
288 yield key, value
17650
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
289
38079
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
290 def iterkeyrefs(self):
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
291 """Return an iterator that yields the weak references to the keys.
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
292
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
293 The references are not guaranteed to be 'live' at the time
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
294 they are used, so the result of calling the references needs
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
295 to be checked before being used. This can be used to avoid
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
296 creating references that will cause the garbage collector to
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
297 keep the keys around longer than needed.
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
298
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
299 """
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
300 return self.data.iterkeys()
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
301
17650
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
302 def iterkeys(self):
33197
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
303 for wr in self.data.iterkeys():
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
304 obj = wr()
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
305 if obj is not None:
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
306 yield obj
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
307
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
308 def __iter__(self):
7da9201bc8b5 SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents: 33117
diff changeset
309 return self.iterkeys()
17650
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
310
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
311 def itervalues(self):
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
312 return self.data.itervalues()
7a367ad43f35 Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents: 17591
diff changeset
313
38079
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
314 def keyrefs(self):
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
315 """Return a list of weak references to the keys.
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
316
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
317 The references are not guaranteed to be 'live' at the time
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
318 they are used, so the result of calling the references needs
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
319 to be checked before being used. This can be used to avoid
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
320 creating references that will cause the garbage collector to
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
321 keep the keys around longer than needed.
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
322
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
323 """
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
324 return self.data.keys()
728c16f16267 SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents: 35018
diff changeset
325
17546
da5eab33147b Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents: 17386
diff changeset
326 def keys(self):
da5eab33147b Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents: 17386
diff changeset
327 L = []
17591
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
328 for wr in self.data.keys():
44a3ac59c268 Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents: 17546
diff changeset
329 o = wr()
17546
da5eab33147b Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents: 17386
diff changeset
330 if o is not None:
da5eab33147b Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents: 17386
diff changeset
331 L.append(o)
da5eab33147b Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents: 17386
diff changeset
332 return L
da5eab33147b Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents: 17386
diff changeset
333
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
334 def popitem(self):
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
335 while 1:
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
336 key, value = self.data.popitem()
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
337 o = key()
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
338 if o is not None:
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
339 return o, value
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
340
28240
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
341 def pop(self, key, *args):
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
342 return self.data.pop(ref(key), *args)
ea70032a24b1 SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents: 24263
diff changeset
343
32155
efb84ed7377d The default argument in dict.setdefault() defaults to None.
Walter Dörwald <walter@livinglogic.de>
parents: 31616
diff changeset
344 def setdefault(self, key, default=None):
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
345 return self.data.setdefault(ref(key, self._remove),default)
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
346
31616
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
347 def update(self, dict=None, **kwargs):
16794
29aa832b8787 Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents: 16424
diff changeset
348 d = self.data
31616
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
349 if dict is not None:
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
350 if not hasattr(dict, "items"):
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
351 dict = type({})(dict)
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
352 for key, value in dict.items():
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
353 d[ref(key, self._remove)] = value
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
354 if len(kwargs):
5b3898d9ba59 SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents: 29257
diff changeset
355 self.update(kwargs)