[Python-checkins] CVS: python/dist/src/Lib weakref.py,1.12,1.13
Fred L. Drake
fdrake@users.sourceforge.net
2001年9月28日 12:01:28 -0700
Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv4234
Modified Files:
weakref.py
Log Message:
Clean up circular references in the Weak*Dictionary classes; this avoids
depending on the cycle detector code in the library implementation.
This is a *slightly* different patch than SF patch #417795, but takes
the same approach. (This version avoids calling the __len__() method of
the dict in the remove() functions.)
This closes SF patch #417795.
Index: weakref.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/weakref.py,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** weakref.py 2001年09月06日 14:51:01 1.12
--- weakref.py 2001年09月28日 19:01:26 1.13
***************
*** 52,58 ****
def __setitem__(self, key, value):
! def remove(o, data=self.data, key=key):
! del data[key]
! self.data[key] = ref(value, remove)
def copy(self):
--- 52,56 ----
def __setitem__(self, key, value):
! self.data[key] = ref(value, self.__makeremove(key))
def copy(self):
***************
*** 106,112 ****
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:
--- 104,108 ----
wr = self.data[key]
except KeyError:
! self.data[key] = ref(default, self.__makeremove(key))
return default
else:
***************
*** 116,122 ****
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):
--- 112,116 ----
d = self.data
for key, o in dict.items():
! d[key] = ref(o, self.__makeremove(key))
def values(self):
***************
*** 128,131 ****
--- 122,132 ----
return L
+ def __makeremove(self, key):
+ def remove(o, selfref=ref(self), key=key):
+ self = selfref()
+ if self is not None:
+ del self.data[key]
+ return remove
+
class WeakKeyDictionary(UserDict.UserDict):
***************
*** 143,148 ****
self.data = {}
if dict is not None: self.update(dict)
! def remove(k, data=self.data):
! del data[k]
self._remove = remove
--- 144,151 ----
self.data = {}
if dict is not None: self.update(dict)
! def remove(k, selfref=ref(self)):
! self = selfref()
! if self is not None:
! del self.data[k]
self._remove = remove