smartdict.py revision 1519
1from convert import *
2
3class SmartDict(dict):
4    class Proxy(str):
5        def __int__(self):
6            return int(to_integer(str(self)))
7        def __long__(self):
8            return long(to_integer(str(self)))
9        def __float__(self):
10            return float(to_integer(str(self)))
11        def __nonzero__(self):
12            return to_bool(str(self))
13        def convert(self, other):
14            t = type(other)
15            if t == bool:
16                return bool(self)
17            if t == int:
18                return int(self)
19            if t == long:
20                return long(self)
21            if t == float:
22                return float(self)
23            return str(self)
24        def __lt__(self, other):
25            return self.convert(other) < other
26        def __le__(self, other):
27            return self.convert(other) <= other
28        def __eq__(self, other):
29            return self.convert(other) == other
30        def __ne__(self, other):
31            return self.convert(other) != other
32        def __gt__(self, other):
33            return self.convert(other) > other
34        def __ge__(self, other):
35            return self.convert(other) >= other
36
37        def __add__(self, other):
38            return self.convert(other) + other
39        def __sub__(self, other):
40            return self.convert(other) - other
41        def __mul__(self, other):
42            return self.convert(other) * other
43        def __div__(self, other):
44            return self.convert(other) / other
45        def __truediv__(self, other):
46            return self.convert(other) / other
47
48        def __radd__(self, other):
49            return other + self.convert(other)
50        def __rsub__(self, other):
51            return other - self.convert(other)
52        def __rmul__(self, other):
53            return other * self.convert(other)
54        def __rdiv__(self, other):
55            return other / self.convert(other)
56        def __rtruediv__(self, other):
57            return other / self.convert(other)
58
59
60    def __getitem__(self, key):
61        return self.Proxy(dict.__getitem__(self, key))
62
63    def __setitem__(self, key, item):
64        dict.__setitem__(self, key, str(item))
65
66    def values(self):
67        return [ self.Proxy(v) for v in dict.values(self) ]
68
69    def itervalues(self):
70        for value in dict.itervalues(self):
71            yield self.Proxy(value)
72
73    def items(self):
74        return [ (k, self.Proxy(v)) for k,v in dict.items(self) ]
75
76    def iteritems(self):
77        for key,value in dict.iteritems(self):
78            yield key, self.Proxy(value)
79
80    def get(self, key, default=''):
81        return self.Proxy(dict.get(self, key, str(default)))
82
83    def setdefault(self, key, default=''):
84        return self.Proxy(dict.setdefault(self, key, str(default)))
85
86