Index: psyco_win32/psyco/kdictproxy.py |
=================================================================== |
--- psyco_win32/psyco/kdictproxy.py (revision 0) |
+++ psyco_win32/psyco/kdictproxy.py (revision 0) |
@@ -0,0 +1,133 @@ |
+########################################################################### |
+# |
+# Support code for the 'psyco.compact' type. |
+ |
+from __future__ import generators |
+ |
+try: |
+ from UserDict import DictMixin |
+except ImportError: |
+ |
+ # backported from Python 2.3 to Python 2.2 |
+ class DictMixin: |
+ # Mixin defining all dictionary methods for classes that already have |
+ # a minimum dictionary interface including getitem, setitem, delitem, |
+ # and keys. Without knowledge of the subclass constructor, the mixin |
+ # does not define __init__() or copy(). In addition to the four base |
+ # methods, progressively more efficiency comes with defining |
+ # __contains__(), __iter__(), and iteritems(). |
+ |
+ # second level definitions support higher levels |
+ def __iter__(self): |
+ for k in self.keys(): |
+ yield k |
+ def has_key(self, key): |
+ try: |
+ value = self[key] |
+ except KeyError: |
+ return False |
+ return True |
+ def __contains__(self, key): |
+ return self.has_key(key) |
+ |
+ # third level takes advantage of second level definitions |
+ def iteritems(self): |
+ for k in self: |
+ yield (k, self[k]) |
+ def iterkeys(self): |
+ return self.__iter__() |
+ |
+ # fourth level uses definitions from lower levels |
+ def itervalues(self): |
+ for _, v in self.iteritems(): |
+ yield v |
+ def values(self): |
+ return [v for _, v in self.iteritems()] |
+ def items(self): |
+ return list(self.iteritems()) |
+ def clear(self): |
+ for key in self.keys(): |
+ del self[key] |
+ def setdefault(self, key, default): |
+ try: |
+ return self[key] |
+ except KeyError: |
+ self[key] = default |
+ return default |
+ def pop(self, key, *args): |
+ if len(args) > 1: |
+ raise TypeError, "pop expected at most 2 arguments, got "\ |
+ + repr(1 + len(args)) |
+ try: |
+ value = self[key] |
+ except KeyError: |
+ if args: |
+ return args[0] |
+ raise |
+ del self[key] |
+ return value |
+ def popitem(self): |
+ try: |
+ k, v = self.iteritems().next() |
+ except StopIteration: |
+ raise KeyError, 'container is empty' |
+ del self[k] |
+ return (k, v) |
+ def update(self, other): |
+ # Make progressively weaker assumptions about "other" |
+ if hasattr(other, 'iteritems'): # iteritems saves memory and lookups |
+ for k, v in other.iteritems(): |
+ self[k] = v |
+ elif hasattr(other, '__iter__'): # iter saves memory |
+ for k in other: |
+ self[k] = other[k] |
+ else: |
+ for k in other.keys(): |
+ self[k] = other[k] |
+ def get(self, key, default=None): |
+ try: |
+ return self[key] |
+ except KeyError: |
+ return default |
+ def __repr__(self): |
+ return repr(dict(self.iteritems())) |
+ def __cmp__(self, other): |
+ if other is None: |
+ return 1 |
+ if isinstance(other, DictMixin): |
+ other = dict(other.iteritems()) |
+ return cmp(dict(self.iteritems()), other) |
+ def __len__(self): |
+ return len(self.keys()) |
+ |
+########################################################################### |
+ |
+from _psyco import compact |
+ |
+ |
+class compactdictproxy(DictMixin): |
+ |
+ def __init__(self, ko): |
+ self._ko = ko # compact object of which 'self' is the dict |
+ |
+ def __getitem__(self, key): |
+ return compact.__getslot__(self._ko, key) |
+ |
+ def __setitem__(self, key, value): |
+ compact.__setslot__(self._ko, key, value) |
+ |
+ def __delitem__(self, key): |
+ compact.__delslot__(self._ko, key) |
+ |
+ def keys(self): |
+ return compact.__members__.__get__(self._ko) |
+ |
+ def clear(self): |
+ keys = self.keys() |
+ keys.reverse() |
+ for key in keys: |
+ del self[key] |
+ |
+ def __repr__(self): |
+ keys = ', '.join(self.keys()) |
+ return '<compactdictproxy object {%s}>' % (keys,) |
Property changes on: psyco_win32\psyco\kdictproxy.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |