[Python-checkins] CVS: python/dist/src/Lib weakref.py,1.3,1.4
Martin v. L?wis
loewis@users.sourceforge.net
Tue, 27 Feb 2001 10:36:58 -0800
Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv22846/Lib
Modified Files:
weakref.py
Log Message:
Patch #403985: Add support for weak-keyed dictionaries
Index: weakref.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/weakref.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -r1.3 -r1.4
*** weakref.py 2001/02/02 19:28:35 1.3
--- weakref.py 2001/02/27 18:36:55 1.4
***************
*** 21,29 ****
! def mapping(dict=None):
! return WeakDictionary(dict)
! class WeakDictionary(UserDict.UserDict):
# We inherit the constructor without worrying about the input
--- 21,32 ----
! def mapping(dict=None,weakkeys=0):
! if weakkeys:
! return WeakKeyDictionary(dict)
! else:
! return WeakValueDictionary(dict)
! class WeakValueDictionary(UserDict.UserDict):
# We inherit the constructor without worrying about the input
***************
*** 112,115 ****
--- 115,172 ----
return L
+
+ class WeakKeyDictionary(UserDict.UserDict):
+
+ def __init__(self, dict=None):
+ self.data = {}
+ if dict is not None: self.update(dict)
+ def remove(k, data=self.data):
+ del data[k]
+ self._remove = remove
+
+ def __getitem__(self, key):
+ return self.data[ref(key)]
+
+ def __repr__(self):
+ return "<WeakKeyDictionary at %s>" % id(self)
+
+ def __setitem__(self, key, value):
+ self.data[ref(key, self._remove)] = value
+
+ def copy(self):
+ new = WeakKeyDictionary()
+ for key, value in self.data.items():
+ o = key()
+ if o is not None:
+ new[o] = value
+
+ def get(self, key, default):
+ return self.data.get(ref(key),default)
+
+ def items(self):
+ L = []
+ for key, value in self.data.items():
+ o = key()
+ if o is not None:
+ L.append((o, value))
+ return L
+
+ def popitem(self):
+ while 1:
+ key, value = self.data.popitem()
+ o = key()
+ if o is not None:
+ return o, value
+
+ def setdefault(self, key, default):
+ return self.data.setdefault(ref(key, self._remove),default)
+
+ 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