[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