Mercurial > cpython-lru_cache-weakref
annotate Lib/weakref.py @ 86127:a3d09c19bb93
merge with 3.3
| author | Georg Brandl <georg@python.org> |
|---|---|
| date | Sun, 06 Oct 2013 19:24:00 +0200 |
| parents | d6ad9d7468f7 |
| children |
| 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 |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45284
diff
changeset
|
5 http://www.python.org/dev/peps/pep-0205/ |
|
16385
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 |
| 33356 | 12 from _weakref import ( |
| 13 getweakrefcount, | |
| 14 getweakrefs, | |
| 15 ref, | |
| 16 proxy, | |
| 17 CallableProxyType, | |
| 18 ProxyType, | |
| 19 ReferenceType) | |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
20 |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
21 from _weakrefset import WeakSet, _IterationGuard |
|
20281
380d4b4ee602
ReferenceError is now built-in, so pick it up from the right place.
Fred Drake <fdrake@acm.org>
parents:
20155
diff
changeset
|
22 |
|
52338
8b5a80f53317
Fix a circular import dependency.
Brett Cannon <bcannon@gmail.com>
parents:
49001
diff
changeset
|
23 import collections # Import after _weakref to avoid circular import. |
|
83631
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
24 import sys |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
25 import itertools |
|
52338
8b5a80f53317
Fix a circular import dependency.
Brett Cannon <bcannon@gmail.com>
parents:
49001
diff
changeset
|
26 |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
27 ProxyTypes = (ProxyType, CallableProxyType) |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
28 |
|
17386
bbcc9837312e
mapping(): Remove this function since it does not add anything to the API.
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
29 __all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs", |
|
48739
3195bd6b6dd7
ReferenceError is undefined. causes test___all__.py to fail. remove it from __all__
Gregory P. Smith <greg@mad-scientist.com>
parents:
48733
diff
changeset
|
30 "WeakKeyDictionary", "ReferenceType", "ProxyType", |
|
45159
e6069b24031e
Moved WeakSet into a bootstap module use by abc.py.
Raymond Hettinger <python@rcn.com>
parents:
43644
diff
changeset
|
31 "CallableProxyType", "ProxyTypes", "WeakValueDictionary", |
|
83631
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
32 "WeakSet", "WeakMethod", "finalize"] |
|
80476
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
33 |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
34 |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
35 class WeakMethod(ref): |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
36 """ |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
37 A custom `weakref.ref` subclass which simulates a weak reference to |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
38 a bound method, working around the lifetime problem of bound methods. |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
39 """ |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
40 |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
41 __slots__ = "_func_ref", "_meth_type", "_alive", "__weakref__" |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
42 |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
43 def __new__(cls, meth, callback=None): |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
44 try: |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
45 obj = meth.__self__ |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
46 func = meth.__func__ |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
47 except AttributeError: |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
48 raise TypeError("argument should be a bound method, not {}" |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
49 .format(type(meth))) from None |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
50 def _cb(arg): |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
51 # The self-weakref trick is needed to avoid creating a reference |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
52 # cycle. |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
53 self = self_wr() |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
54 if self._alive: |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
55 self._alive = False |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
56 if callback is not None: |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
57 callback(self) |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
58 self = ref.__new__(cls, obj, _cb) |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
59 self._func_ref = ref(func, _cb) |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
60 self._meth_type = type(meth) |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
61 self._alive = True |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
62 self_wr = ref(self) |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
63 return self |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
64 |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
65 def __call__(self): |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
66 obj = super().__call__() |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
67 func = self._func_ref() |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
68 if obj is None or func is None: |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
69 return None |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
70 return self._meth_type(func, obj) |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
71 |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
72 def __eq__(self, other): |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
73 if isinstance(other, WeakMethod): |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
74 if not self._alive or not other._alive: |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
75 return self is other |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
76 return ref.__eq__(self, other) and self._func_ref == other._func_ref |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
77 return False |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
78 |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
79 def __ne__(self, other): |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
80 if isinstance(other, WeakMethod): |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
81 if not self._alive or not other._alive: |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
82 return self is not other |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
83 return ref.__ne__(self, other) or self._func_ref != other._func_ref |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
84 return True |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
85 |
|
27c20650aeab
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references to bound methods.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79378
diff
changeset
|
86 __hash__ = ref.__hash__ |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
87 |
|
17591
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
88 |
|
45161
bdf7486893ba
Decouple weakref containers from UserDict
Raymond Hettinger <python@rcn.com>
parents:
45159
diff
changeset
|
89 class WeakValueDictionary(collections.MutableMapping): |
|
17591
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
90 """Mapping class that references values weakly. |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
91 |
|
17591
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
92 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
|
93 reference to the value exists anymore |
|
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
94 """ |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
95 # We inherit the constructor without worrying about the input |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
96 # 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
|
97 # 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
|
98 # 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
|
99 # way in). |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
100 |
|
32472
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
101 def __init__(self, *args, **kw): |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
102 def remove(wr, selfref=ref(self)): |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
103 self = selfref() |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
104 if self is not None: |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
105 if self._iterating: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
106 self._pending_removals.append(wr.key) |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
107 else: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
108 del self.data[wr.key] |
|
32472
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
109 self._remove = remove |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
110 # A list of keys to be removed |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
111 self._pending_removals = [] |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
112 self._iterating = set() |
|
45161
bdf7486893ba
Decouple weakref containers from UserDict
Raymond Hettinger <python@rcn.com>
parents:
45159
diff
changeset
|
113 self.data = d = {} |
|
54456
49485f98a308
Issue #6149: Fix initialization of WeakValueDictionary objects from non-empty parameters.
Antoine Pitrou <solipsis@pitrou.net>
parents:
54100
diff
changeset
|
114 self.update(*args, **kw) |
|
32472
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
115 |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
116 def _commit_removals(self): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
117 l = self._pending_removals |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
118 d = self.data |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
119 # We shouldn't encounter any KeyError, because this method should |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
120 # always be called *before* mutating the dict. |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
121 while l: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
122 del d[l.pop()] |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
123 |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
124 def __getitem__(self, key): |
|
18952
e90a658a58d4
Make sure that WeakValueDictionary[] raises KeyError instead of TypeError
Fred Drake <fdrake@acm.org>
parents:
17650
diff
changeset
|
125 o = self.data[key]() |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
126 if o is None: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42084
diff
changeset
|
127 raise KeyError(key) |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
128 else: |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
129 return o |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
130 |
|
45161
bdf7486893ba
Decouple weakref containers from UserDict
Raymond Hettinger <python@rcn.com>
parents:
45159
diff
changeset
|
131 def __delitem__(self, key): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
132 if self._pending_removals: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
133 self._commit_removals() |
|
45161
bdf7486893ba
Decouple weakref containers from UserDict
Raymond Hettinger <python@rcn.com>
parents:
45159
diff
changeset
|
134 del self.data[key] |
|
bdf7486893ba
Decouple weakref containers from UserDict
Raymond Hettinger <python@rcn.com>
parents:
45159
diff
changeset
|
135 |
|
bdf7486893ba
Decouple weakref containers from UserDict
Raymond Hettinger <python@rcn.com>
parents:
45159
diff
changeset
|
136 def __len__(self): |
|
75356
1cd0688ff004
Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66629
diff
changeset
|
137 return len(self.data) - len(self._pending_removals) |
|
45161
bdf7486893ba
Decouple weakref containers from UserDict
Raymond Hettinger <python@rcn.com>
parents:
45159
diff
changeset
|
138 |
|
33197
7da9201bc8b5
SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents:
33117
diff
changeset
|
139 def __contains__(self, key): |
|
7da9201bc8b5
SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents:
33117
diff
changeset
|
140 try: |
|
7da9201bc8b5
SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents:
33117
diff
changeset
|
141 o = self.data[key]() |
|
7da9201bc8b5
SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents:
33117
diff
changeset
|
142 except KeyError: |
|
7da9201bc8b5
SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents:
33117
diff
changeset
|
143 return False |
|
7da9201bc8b5
SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents:
33117
diff
changeset
|
144 return o is not None |
|
7da9201bc8b5
SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents:
33117
diff
changeset
|
145 |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
146 def __repr__(self): |
|
16884
1ce751fa67d8
Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents:
16794
diff
changeset
|
147 return "<WeakValueDictionary at %s>" % id(self) |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
148 |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
149 def __setitem__(self, key, value): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
150 if self._pending_removals: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
151 self._commit_removals() |
|
32472
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
152 self.data[key] = KeyedRef(value, self._remove, key) |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
153 |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
154 def copy(self): |
|
16884
1ce751fa67d8
Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents:
16794
diff
changeset
|
155 new = WeakValueDictionary() |
|
17591
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
156 for key, wr in self.data.items(): |
|
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
157 o = wr() |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
158 if o is not None: |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
159 new[key] = o |
|
16884
1ce751fa67d8
Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents:
16794
diff
changeset
|
160 return new |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
161 |
|
54100
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
162 __copy__ = copy |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
163 |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
164 def __deepcopy__(self, memo): |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
165 from copy import deepcopy |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
166 new = self.__class__() |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
167 for key, wr in self.data.items(): |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
168 o = wr() |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
169 if o is not None: |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
170 new[deepcopy(key, memo)] = o |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
171 return new |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
172 |
|
17546
da5eab33147b
Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents:
17386
diff
changeset
|
173 def get(self, key, default=None): |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
174 try: |
|
17591
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
175 wr = self.data[key] |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
176 except KeyError: |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
177 return default |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
178 else: |
|
17591
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
179 o = wr() |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
180 if o is None: |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
181 # This should only happen |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
182 return default |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
183 else: |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
184 return o |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
185 |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
186 def items(self): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
187 with _IterationGuard(self): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
188 for k, wr in self.data.items(): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
189 v = wr() |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
190 if v is not None: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
191 yield k, v |
|
17650
7a367ad43f35
Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents:
17591
diff
changeset
|
192 |
|
49001
5b7845ef4efd
Committing the patch in issue 2965, so that weakref dicts have a closer
Barry Warsaw <barry@python.org>
parents:
48739
diff
changeset
|
193 def keys(self): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
194 with _IterationGuard(self): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
195 for k, wr in self.data.items(): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
196 if wr() is not None: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
197 yield k |
|
33197
7da9201bc8b5
SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents:
33117
diff
changeset
|
198 |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
199 __iter__ = keys |
|
17650
7a367ad43f35
Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents:
17591
diff
changeset
|
200 |
|
38079
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
201 def itervaluerefs(self): |
|
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
202 """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
|
203 |
|
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
204 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
|
205 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
|
206 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
|
207 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
|
208 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
|
209 |
|
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
210 """ |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
211 with _IterationGuard(self): |
| 79378 | 212 yield from self.data.values() |
|
38079
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
213 |
|
49001
5b7845ef4efd
Committing the patch in issue 2965, so that weakref dicts have a closer
Barry Warsaw <barry@python.org>
parents:
48739
diff
changeset
|
214 def values(self): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
215 with _IterationGuard(self): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
216 for wr in self.data.values(): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
217 obj = wr() |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
218 if obj is not None: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
219 yield obj |
|
17650
7a367ad43f35
Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents:
17591
diff
changeset
|
220 |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
221 def popitem(self): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
222 if self._pending_removals: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
223 self._commit_removals() |
| 66629 | 224 while True: |
|
17591
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
225 key, wr = self.data.popitem() |
|
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
226 o = wr() |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
227 if o is not None: |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
228 return key, o |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
229 |
|
28240
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
230 def pop(self, key, *args): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
231 if self._pending_removals: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
232 self._commit_removals() |
|
28240
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
233 try: |
|
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
234 o = self.data.pop(key)() |
|
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
235 except KeyError: |
|
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
236 if args: |
|
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
237 return args[0] |
|
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
238 raise |
|
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
239 if o is None: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42084
diff
changeset
|
240 raise KeyError(key) |
|
28240
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
241 else: |
|
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
242 return o |
|
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
243 |
|
32155
efb84ed7377d
The default argument in dict.setdefault() defaults to None.
Walter Dörwald <walter@livinglogic.de>
parents:
31616
diff
changeset
|
244 def setdefault(self, key, default=None): |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
245 try: |
|
17591
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
246 wr = self.data[key] |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
247 except KeyError: |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
248 if self._pending_removals: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
249 self._commit_removals() |
|
32472
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
250 self.data[key] = KeyedRef(default, self._remove, key) |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
251 return default |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
252 else: |
|
17591
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
253 return wr() |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
254 |
|
31616
5b3898d9ba59
SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents:
29257
diff
changeset
|
255 def update(self, dict=None, **kwargs): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
256 if self._pending_removals: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
257 self._commit_removals() |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
258 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
|
259 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
|
260 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
|
261 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
|
262 for key, o in dict.items(): |
|
32472
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
263 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
|
264 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
|
265 self.update(kwargs) |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
266 |
|
38079
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
267 def valuerefs(self): |
|
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
268 """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
|
269 |
|
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
270 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
|
271 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
|
272 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
|
273 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
|
274 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
|
275 |
|
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
276 """ |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
277 return list(self.data.values()) |
|
38079
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
278 |
|
32472
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
279 |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
280 class KeyedRef(ref): |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
281 """Specialized reference that includes a key corresponding to the value. |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
282 |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
283 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
|
284 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
|
285 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
|
286 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
|
287 |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
288 """ |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
289 |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
290 __slots__ = "key", |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
291 |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
292 def __new__(type, ob, callback, key): |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
293 self = ref.__new__(type, ob, callback) |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
294 self.key = key |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
295 return self |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
296 |
|
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32155
diff
changeset
|
297 def __init__(self, ob, callback, key): |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40949
diff
changeset
|
298 super().__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
|
299 |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
diff
changeset
|
300 |
|
45161
bdf7486893ba
Decouple weakref containers from UserDict
Raymond Hettinger <python@rcn.com>
parents:
45159
diff
changeset
|
301 class WeakKeyDictionary(collections.MutableMapping): |
|
17591
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
302 """ Mapping class that references keys weakly. |
|
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
303 |
|
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
304 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
|
305 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
|
306 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
|
307 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
|
308 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
|
309 accesses. |
|
44a3ac59c268
Weak*Dictionary: Added docstrings to the classes.
Fred Drake <fdrake@acm.org>
parents:
17546
diff
changeset
|
310 """ |
|
16794
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
311 |
|
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
312 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
|
313 self.data = {} |
|
20155
bbb353d31e25
Clean up circular references in the Weak*Dictionary classes; this avoids
Fred Drake <fdrake@acm.org>
parents:
19763
diff
changeset
|
314 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
|
315 self = selfref() |
|
bbb353d31e25
Clean up circular references in the Weak*Dictionary classes; this avoids
Fred Drake <fdrake@acm.org>
parents:
19763
diff
changeset
|
316 if self is not None: |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
317 if self._iterating: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
318 self._pending_removals.append(k) |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
319 else: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
320 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
|
321 self._remove = remove |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
322 # A list of dead weakrefs (keys to be removed) |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
323 self._pending_removals = [] |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
324 self._iterating = set() |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
325 if dict is not None: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
326 self.update(dict) |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
327 |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
328 def _commit_removals(self): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
329 # NOTE: We don't need to call this method before mutating the dict, |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
330 # because a dead weakref never compares equal to a live weakref, |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
331 # even if they happened to refer to equal objects. |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
332 # However, it means keys may already have been removed. |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
333 l = self._pending_removals |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
334 d = self.data |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
335 while l: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
336 try: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
337 del d[l.pop()] |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
338 except KeyError: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
339 pass |
|
16794
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
340 |
|
19763
94d0f2eea047
Add __delitem__() support for WeakKeyDictionary.
Fred Drake <fdrake@acm.org>
parents:
18952
diff
changeset
|
341 def __delitem__(self, key): |
|
29257
dea38116c373
SF 742860: WeakKeyDictionary __delitem__ uses iterkeys
Tim Peters <tim.peters@gmail.com>
parents:
28240
diff
changeset
|
342 del self.data[ref(key)] |
|
19763
94d0f2eea047
Add __delitem__() support for WeakKeyDictionary.
Fred Drake <fdrake@acm.org>
parents:
18952
diff
changeset
|
343 |
|
16794
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
344 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
|
345 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
|
346 |
|
45161
bdf7486893ba
Decouple weakref containers from UserDict
Raymond Hettinger <python@rcn.com>
parents:
45159
diff
changeset
|
347 def __len__(self): |
|
75356
1cd0688ff004
Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66629
diff
changeset
|
348 return len(self.data) - len(self._pending_removals) |
|
45161
bdf7486893ba
Decouple weakref containers from UserDict
Raymond Hettinger <python@rcn.com>
parents:
45159
diff
changeset
|
349 |
|
16794
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
350 def __repr__(self): |
|
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
351 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
|
352 |
|
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
353 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
|
354 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
|
355 |
|
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
356 def copy(self): |
|
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
357 new = WeakKeyDictionary() |
|
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
358 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
|
359 o = key() |
|
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
360 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
|
361 new[o] = value |
|
16884
1ce751fa67d8
Change WeakDictionary to WeakValueDictionary in a couple more places.
Fred Drake <fdrake@acm.org>
parents:
16794
diff
changeset
|
362 return new |
|
16794
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
363 |
|
54100
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
364 __copy__ = copy |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
365 |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
366 def __deepcopy__(self, memo): |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
367 from copy import deepcopy |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
368 new = self.__class__() |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
369 for key, value in self.data.items(): |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
370 o = key() |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
371 if o is not None: |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
372 new[o] = deepcopy(value, memo) |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
373 return new |
|
85fb4c229a9c
Merged revisions 72669 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52338
diff
changeset
|
374 |
|
17546
da5eab33147b
Weak*Dictionary.update(): Fix calls to [].append() to only have one
Fred Drake <fdrake@acm.org>
parents:
17386
diff
changeset
|
375 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
|
376 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
|
377 |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
20902
diff
changeset
|
378 def __contains__(self, key): |
|
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
20902
diff
changeset
|
379 try: |
|
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
20902
diff
changeset
|
380 wr = ref(key) |
|
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
20902
diff
changeset
|
381 except TypeError: |
| 66629 | 382 return False |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
20902
diff
changeset
|
383 return wr in self.data |
|
24263
e6033254df21
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
23764
diff
changeset
|
384 |
|
16794
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
385 def items(self): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
386 with _IterationGuard(self): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
387 for wr, value in self.data.items(): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
388 key = wr() |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
389 if key is not None: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
390 yield key, value |
|
38079
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
391 |
|
49001
5b7845ef4efd
Committing the patch in issue 2965, so that weakref dicts have a closer
Barry Warsaw <barry@python.org>
parents:
48739
diff
changeset
|
392 def keys(self): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
393 with _IterationGuard(self): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
394 for wr in self.data: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
395 obj = wr() |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
396 if obj is not None: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
397 yield obj |
|
33197
7da9201bc8b5
SF bug #1012315: weakref.WeakValueDictionary should override .has_key()
Raymond Hettinger <python@rcn.com>
parents:
33117
diff
changeset
|
398 |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
399 __iter__ = keys |
|
17650
7a367ad43f35
Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents:
17591
diff
changeset
|
400 |
|
49001
5b7845ef4efd
Committing the patch in issue 2965, so that weakref dicts have a closer
Barry Warsaw <barry@python.org>
parents:
48739
diff
changeset
|
401 def values(self): |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
402 with _IterationGuard(self): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
403 for wr, value in self.data.items(): |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
404 if wr() is not None: |
|
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
405 yield value |
|
17650
7a367ad43f35
Added iterator support to the Weak*Dictionary classes.
Fred Drake <fdrake@acm.org>
parents:
17591
diff
changeset
|
406 |
|
38079
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
407 def keyrefs(self): |
|
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
408 """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
|
409 |
|
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
410 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
|
411 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
|
412 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
|
413 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
|
414 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
|
415 |
|
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
416 """ |
|
58194
84caac71d79b
Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents:
54456
diff
changeset
|
417 return list(self.data) |
|
38079
728c16f16267
SF #1479988: add methods to allow access to weakrefs for the
Fred Drake <fdrake@acm.org>
parents:
35018
diff
changeset
|
418 |
|
16794
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
419 def popitem(self): |
| 66629 | 420 while True: |
|
16794
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
421 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
|
422 o = key() |
|
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
423 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
|
424 return o, value |
|
29aa832b8787
Patch #403985: Add support for weak-keyed dictionaries
Martin v. Löwis <martin@v.loewis.de>
parents:
16424
diff
changeset
|
425 |
|
28240
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
426 def pop(self, key, *args): |
|
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
427 return self.data.pop(ref(key), *args) |
|
ea70032a24b1
SF patch #667730: More DictMixin
Raymond Hettinger <python@rcn.com>
parents:
24263
diff
changeset
|
428 |
|
32155
efb84ed7377d
The default argument in dict.setdefault() defaults to None.
Walter Dörwald <walter@livinglogic.de>
parents:
31616
diff
changeset
|
429 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
|
430 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
|
431 |
|
31616
5b3898d9ba59
SF #904720: dict.update should take a 2-tuple sequence like dict.__init_
Raymond Hettinger <python@rcn.com>
parents:
29257
diff
changeset
|
432 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
|
433 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
|
434 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
|
435 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
|
436 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
|
437 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
|
438 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
|
439 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
|
440 self.update(kwargs) |
|
83631
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
441 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
442 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
443 class finalize: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
444 """Class for finalization of weakrefable objects |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
445 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
446 finalize(obj, func, *args, **kwargs) returns a callable finalizer |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
447 object which will be called when obj is garbage collected. The |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
448 first time the finalizer is called it evaluates func(*arg, **kwargs) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
449 and returns the result. After this the finalizer is dead, and |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
450 calling it just returns None. |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
451 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
452 When the program exits any remaining finalizers for which the |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
453 atexit attribute is true will be run in reverse order of creation. |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
454 By default atexit is true. |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
455 """ |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
456 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
457 # Finalizer objects don't have any state of their own. They are |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
458 # just used as keys to lookup _Info objects in the registry. This |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
459 # ensures that they cannot be part of a ref-cycle. |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
460 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
461 __slots__ = () |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
462 _registry = {} |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
463 _shutdown = False |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
464 _index_iter = itertools.count() |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
465 _dirty = False |
|
84057
d6ad9d7468f7
Issue #15528: Delay importing atexit until weakref.finalize() used.
Richard Oudkerk <shibturn@gmail.com>
parents:
83631
diff
changeset
|
466 _registered_with_atexit = False |
|
83631
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
467 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
468 class _Info: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
469 __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index") |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
470 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
471 def __init__(self, obj, func, *args, **kwargs): |
|
84057
d6ad9d7468f7
Issue #15528: Delay importing atexit until weakref.finalize() used.
Richard Oudkerk <shibturn@gmail.com>
parents:
83631
diff
changeset
|
472 if not self._registered_with_atexit: |
|
d6ad9d7468f7
Issue #15528: Delay importing atexit until weakref.finalize() used.
Richard Oudkerk <shibturn@gmail.com>
parents:
83631
diff
changeset
|
473 # We may register the exit function more than once because |
|
d6ad9d7468f7
Issue #15528: Delay importing atexit until weakref.finalize() used.
Richard Oudkerk <shibturn@gmail.com>
parents:
83631
diff
changeset
|
474 # of a thread race, but that is harmless |
|
d6ad9d7468f7
Issue #15528: Delay importing atexit until weakref.finalize() used.
Richard Oudkerk <shibturn@gmail.com>
parents:
83631
diff
changeset
|
475 import atexit |
|
d6ad9d7468f7
Issue #15528: Delay importing atexit until weakref.finalize() used.
Richard Oudkerk <shibturn@gmail.com>
parents:
83631
diff
changeset
|
476 atexit.register(self._exitfunc) |
|
d6ad9d7468f7
Issue #15528: Delay importing atexit until weakref.finalize() used.
Richard Oudkerk <shibturn@gmail.com>
parents:
83631
diff
changeset
|
477 finalize._registered_with_atexit = True |
|
83631
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
478 info = self._Info() |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
479 info.weakref = ref(obj, self) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
480 info.func = func |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
481 info.args = args |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
482 info.kwargs = kwargs or None |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
483 info.atexit = True |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
484 info.index = next(self._index_iter) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
485 self._registry[self] = info |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
486 finalize._dirty = True |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
487 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
488 def __call__(self, _=None): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
489 """If alive then mark as dead and return func(*args, **kwargs); |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
490 otherwise return None""" |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
491 info = self._registry.pop(self, None) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
492 if info and not self._shutdown: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
493 return info.func(*info.args, **(info.kwargs or {})) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
494 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
495 def detach(self): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
496 """If alive then mark as dead and return (obj, func, args, kwargs); |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
497 otherwise return None""" |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
498 info = self._registry.get(self) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
499 obj = info and info.weakref() |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
500 if obj is not None and self._registry.pop(self, None): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
501 return (obj, info.func, info.args, info.kwargs or {}) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
502 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
503 def peek(self): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
504 """If alive then return (obj, func, args, kwargs); |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
505 otherwise return None""" |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
506 info = self._registry.get(self) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
507 obj = info and info.weakref() |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
508 if obj is not None: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
509 return (obj, info.func, info.args, info.kwargs or {}) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
510 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
511 @property |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
512 def alive(self): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
513 """Whether finalizer is alive""" |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
514 return self in self._registry |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
515 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
516 @property |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
517 def atexit(self): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
518 """Whether finalizer should be called at exit""" |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
519 info = self._registry.get(self) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
520 return bool(info) and info.atexit |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
521 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
522 @atexit.setter |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
523 def atexit(self, value): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
524 info = self._registry.get(self) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
525 if info: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
526 info.atexit = bool(value) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
527 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
528 def __repr__(self): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
529 info = self._registry.get(self) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
530 obj = info and info.weakref() |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
531 if obj is None: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
532 return '<%s object at %#x; dead>' % (type(self).__name__, id(self)) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
533 else: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
534 return '<%s object at %#x; for %r at %#x>' % \ |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
535 (type(self).__name__, id(self), type(obj).__name__, id(obj)) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
536 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
537 @classmethod |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
538 def _select_for_exit(cls): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
539 # Return live finalizers marked for exit, oldest first |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
540 L = [(f,i) for (f,i) in cls._registry.items() if i.atexit] |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
541 L.sort(key=lambda item:item[1].index) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
542 return [f for (f,i) in L] |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
543 |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
544 @classmethod |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
545 def _exitfunc(cls): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
546 # At shutdown invoke finalizers for which atexit is true. |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
547 # This is called once all other non-daemonic threads have been |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
548 # joined. |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
549 reenable_gc = False |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
550 try: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
551 if cls._registry: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
552 import gc |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
553 if gc.isenabled(): |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
554 reenable_gc = True |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
555 gc.disable() |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
556 pending = None |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
557 while True: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
558 if pending is None or finalize._dirty: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
559 pending = cls._select_for_exit() |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
560 finalize._dirty = False |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
561 if not pending: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
562 break |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
563 f = pending.pop() |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
564 try: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
565 # gc is disabled, so (assuming no daemonic |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
566 # threads) the following is the only line in |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
567 # this function which might trigger creation |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
568 # of a new finalizer |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
569 f() |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
570 except Exception: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
571 sys.excepthook(*sys.exc_info()) |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
572 assert f not in cls._registry |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
573 finally: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
574 # prevent any more finalizers from executing during shutdown |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
575 finalize._shutdown = True |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
576 if reenable_gc: |
|
186cf551dae5
Issue #15528: Add weakref.finalize to support finalization using
Richard Oudkerk <shibturn@gmail.com>
parents:
83629
diff
changeset
|
577 gc.enable() |
