1 """Weak reference support for Python.
3 This module is an implementation of PEP 205:
5 http://python.sourceforge.net/peps/pep-0205.html
10 from _weakref
import \
20 ProxyTypes
= (ProxyType
, CallableProxyType
)
22 __all__
= ["ref", "mapping", "proxy", "getweakrefcount", "getweakrefs",
23 "WeakKeyDictionary", "ReferenceType", "ProxyType",
24 "CallableProxyType", "ProxyTypes", "WeakValueDictionary"]
26 def mapping(dict=None,weakkeys
=0):
28 return WeakKeyDictionary(dict)
30 return WeakValueDictionary(dict)
33 class WeakValueDictionary(UserDict
.UserDict
):
35 # We inherit the constructor without worrying about the input
36 # dictionary; since it uses our .update() method, we get the right
37 # checks (if the other dictionary is a WeakValueDictionary,
38 # objects are unwrapped on the way out, and we always wrap on the
41 def __getitem__(self
, key
):
42 o
= self
.data
.get(key
)()
49 return "<WeakValueDictionary at %s>" % id(self
)
51 def __setitem__(self
, key
, value
):
52 def remove(o
, data
=self
.data
, key
=key
):
54 self
.data
[key
] = ref(value
, remove
)
57 new
= WeakValueDictionary()
58 for key
, ref
in self
.data
.items():
64 def get(self
, key
, default
):
72 # This should only happen
79 for key
, ref
in self
.data
.items():
87 key
, ref
= self
.data
.popitem()
92 def setdefault(self
, key
, default
):
96 def remove(o
, data
=self
.data
, key
=key
):
98 ref
= ref(default
, remove
)
104 def update(self
, dict):
107 for key
, o
in dict.items():
108 def remove(o
, data
=d
, key
=key
):
110 L
.append(key
, ref(o
, remove
))
116 for ref
in self
.data
.values():
123 class WeakKeyDictionary(UserDict
.UserDict
):
125 def __init__(self
, dict=None):
127 if dict is not None: self
.update(dict)
128 def remove(k
, data
=self
.data
):
130 self
._remove
= remove
132 def __getitem__(self
, key
):
133 return self
.data
[ref(key
)]
136 return "<WeakKeyDictionary at %s>" % id(self
)
138 def __setitem__(self
, key
, value
):
139 self
.data
[ref(key
, self
._remove
)] = value
142 new
= WeakKeyDictionary()
143 for key
, value
in self
.data
.items():
149 def get(self
, key
, default
):
150 return self
.data
.get(ref(key
),default
)
154 for key
, value
in self
.data
.items():
162 key
, value
= self
.data
.popitem()
167 def setdefault(self
, key
, default
):
168 return self
.data
.setdefault(ref(key
, self
._remove
),default
)
170 def update(self
, dict):
173 for key
, value
in dict.items():
174 L
.append(ref(key
, self
._remove
), value
)