1 from bisect import bisect, insort
2
3 _NO_DEFAULT = object()
4
6 __slots__ = ["_keys",]
7
9 if arg:
10 dict.__init__(self, arg, **kw)
11 else:
12 dict.__init__(self, **kw)
13 arg_keys = getattr(arg, "keys", None)
14 if callable(arg_keys):
15 keys = self._keys = arg_keys()
16 self._keys.sort()
17 else:
18 keys = self._keys = []
19 if arg is not None:
20 for k,_ in arg:
21 insort(keys, k)
22 for k in kw:
23 insort(keys, k)
24
31
33 if k not in self:
34 insort(self._keys, k)
35 return dict.__setitem__(self, k, v)
36
40
52
59
66
67 - def update(self, e=None, **f):
68 e_keys = getattr(e, "keys", None)
69 if callable(e_keys):
70 for k in e_keys():
71 self[k] = e[k]
72 elif e is not None:
73 for k, v in e:
74 self[k] = v
75 for k, v in f.iteritems():
76 self[k] = v
77
80
82 return [ self[k] for k in self._keys ]
83
85 return [ (k, self[k]) for k in self._keys ]
86
89
91 return ( self[k] for k in self._keys )
92
94 return ( (k, self[k]) for k in self._keys )
95
96
97 if __name__ == "__main__":
98 d = SortedDict({"c":"C"}, b="B", d="D")
99 print d.items()
100 d["a"] = "A"
101 print d.items()
102 del d["b"]
103 print d.items()
104 d.pop("e", "E")
105 d.pop("d")
106 print d.items()
107 print d.popitem(),
108 print d.items()
109 d.update({"b":"BB"}, c="CC")
110 d.update([("a", "AA")])
111 print d.items()
112 print d.setdefaults("a", "AAA"),
113 print d.setdefaults("d", "DD"),
114 print d.items()
115 d.clear()
116 print d.items()
117