[Python-checkins] CVS: python/dist/src/Lib weakref.py,1.8,1.9
Fred L. Drake
fdrake@users.sourceforge.net
Thu, 19 Apr 2001 09:26:08 -0700
Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv519
Modified Files:
weakref.py
Log Message:
Weak*Dictionary: Added docstrings to the classes.
Weak*Dictionary.update(): No longer create a temporary list to hold the
things that will be stuffed into the underlying dictionary. This had
been done so that if any of the objects used as the weakly-held value
was not weakly-referencable, no updates would take place (TypeError
would be raised). With this change, TypeError will still be raised
but a partial update could occur. This is more like other .update()
implementations.
Thoughout, use of the name "ref" as a local variable has been removed. The
original use of the name occurred when the function to create a weak
reference was called "new"; the overloaded use of the name could be
confusing for someone reading the code. "ref" used as a variable name
has been replaced with "wr" (for 'weak reference').
Index: weakref.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/weakref.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -r1.8 -r1.9
*** weakref.py 2001/04/16 17:34:48 1.8
--- weakref.py 2001/04/19 16:26:06 1.9
***************
*** 6,9 ****
--- 6,13 ----
"""
+ # Naming convention: Variables named "wr" are weak reference objects;
+ # they are called this instead of "ref" to avoid name collisions with
+ # the module-global ref() function imported from _weakref.
+
import UserDict
***************
*** 24,29 ****
--- 28,38 ----
"CallableProxyType", "ProxyTypes", "WeakValueDictionary"]
+
class WeakValueDictionary(UserDict.UserDict):
+ """Mapping class that references values weakly.
+ Entries in the dictionary will be discarded when no strong
+ reference to the value exists anymore
+ """
# We inherit the constructor without worrying about the input
# dictionary; since it uses our .update() method, we get the right
***************
*** 49,54 ****
def copy(self):
new = WeakValueDictionary()
! for key, ref in self.data.items():
! o = ref()
if o is not None:
new[key] = o
--- 58,63 ----
def copy(self):
new = WeakValueDictionary()
! for key, wr in self.data.items():
! o = wr()
if o is not None:
new[key] = o
***************
*** 57,65 ****
def get(self, key, default=None):
try:
! ref = self.data[key]
except KeyError:
return default
else:
! o = ref()
if o is None:
# This should only happen
--- 66,74 ----
def get(self, key, default=None):
try:
! wr = self.data[key]
except KeyError:
return default
else:
! o = wr()
if o is None:
# This should only happen
***************
*** 70,75 ****
def items(self):
L = []
! for key, ref in self.data.items():
! o = ref()
if o is not None:
L.append((key, o))
--- 79,84 ----
def items(self):
L = []
! for key, wr in self.data.items():
! o = wr()
if o is not None:
L.append((key, o))
***************
*** 78,83 ****
def popitem(self):
while 1:
! key, ref = self.data.popitem()
! o = ref()
if o is not None:
return key, o
--- 87,92 ----
def popitem(self):
while 1:
! key, wr = self.data.popitem()
! o = wr()
if o is not None:
return key, o
***************
*** 85,112 ****
def setdefault(self, key, default):
try:
! ref = self.data[key]
except KeyError:
def remove(o, data=self.data, key=key):
del data[key]
! ref = ref(default, remove)
! self.data[key] = ref
return default
else:
! return ref()
def update(self, dict):
d = self.data
- L = []
for key, o in dict.items():
def remove(o, data=d, key=key):
del data[key]
! L.append((key, ref(o, remove)))
! for key, r in L:
! d[key] = r
def values(self):
L = []
! for ref in self.data.values():
! o = ref()
if o is not None:
L.append(o)
--- 94,117 ----
def setdefault(self, key, default):
try:
! wr = self.data[key]
except KeyError:
def remove(o, data=self.data, key=key):
del data[key]
! self.data[key] = ref(default, remove)
return default
else:
! return wr()
def update(self, dict):
d = self.data
for key, o in dict.items():
def remove(o, data=d, key=key):
del data[key]
! d[key] = ref(o, remove)
def values(self):
L = []
! for wr in self.data.values():
! o = wr()
if o is not None:
L.append(o)
***************
*** 115,119 ****
--- 120,133 ----
class WeakKeyDictionary(UserDict.UserDict):
+ """ Mapping class that references keys weakly.
+ Entries in the dictionary will be discarded when there is no
+ longer a strong reference to the key. This can be used to
+ associate additional data with an object owned by other parts of
+ an application without adding attributes to those objects. This
+ can be especially useful with objects that override attribute
+ accesses.
+ """
+
def __init__(self, dict=None):
self.data = {}
***************
*** 156,161 ****
def keys(self):
L = []
! for ref in self.data.keys():
! o = ref()
if o is not None:
L.append(o)
--- 170,175 ----
def keys(self):
L = []
! for wr in self.data.keys():
! o = wr()
if o is not None:
L.append(o)
***************
*** 174,182 ****
def update(self, dict):
d = self.data
- L = []
for key, value in dict.items():
! L.append((ref(key, self._remove), value))
! for key, r in L:
! d[key] = r
# no longer needed
--- 188,194 ----
def update(self, dict):
d = self.data
for key, value in dict.items():
! d[ref(key, self._remove)] = value
!
# no longer needed