File: kdictproxy.py

package info (click to toggle)
psyco-doc 1.6-1
  • links: PTS
  • area: contrib
  • in suites: lenny
  • size: 1,832 kB
  • ctags: 3,236
  • sloc: ansic: 23,895; python: 5,646; perl: 1,309; makefile: 153
file content (133 lines) | stat: -rw-r--r-- 4,369 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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,)