| 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
 | 
| 
 | 
| 
 |