1 __all__
= [ 'multidict' ]
3 class multidict(object):
5 def __init__(self
, parent
= {}, **kwargs
):
6 self
.dict = dict(**kwargs
)
11 return str(dict(self
.items()))
14 return `
dict(self
.items())`
16 def __contains__(self
, key
):
17 return self
.dict.has_key(key
) or self
.parent
.has_key(key
)
19 def __delitem__(self
, key
):
23 if key
in self
.parent
:
24 self
.deleted
[key
] = True
28 def __setitem__(self
, key
, value
):
29 self
.deleted
.pop(key
, False)
30 self
.dict[key
] = value
32 def __getitem__(self
, key
):
36 if not self
.deleted
.get(key
, False) and key
in self
.parent
:
37 return self
.parent
[key
]
42 return len(self
.dict) + len(self
.parent
)
45 for key
,value
in self
.dict.items():
49 for key
,value
in self
.parent
.next():
50 if key
not in self
.dict and key
not in self
.deleted
:
53 def has_key(self
, key
):
57 for item
in self
.next():
61 return [ item
for item
in self
.next() ]
64 for key
,value
in self
.next():
68 return [ key
for key
,value
in self
.next() ]
71 for key
,value
in self
.next():
75 return [ value
for key
,value
in self
.next() ]
77 def get(self
, key
, default
=__nodefault
):
81 if default
!= self
.__nodefault
:
86 def setdefault(self
, key
, default
):
90 self
.deleted
.pop(key
, False)
91 self
.dict[key
] = default
95 print 'multidict dump'
97 while isinstance(node
, multidict
):
101 def _dumpkey(self
, key
):
104 while isinstance(node
, multidict
):
106 values
.append(node
.dict[key
])
110 if __name__
== '__main__':
112 test2
= multidict(test1
)
113 test3
= multidict(test2
)
114 test4
= multidict(test3
)
116 test1
['a'] = 'test1_a'
117 test1
['b'] = 'test1_b'
118 test1
['c'] = 'test1_c'
119 test1
['d'] = 'test1_d'
120 test1
['e'] = 'test1_e'
122 test2
['a'] = 'test2_a'
124 test2
['c'] = 'test2_c'
127 test2
.setdefault('f', multidict
)
129 print 'test1>', test1
.items()
130 print 'test2>', test2
.items()
143 for key
in test2
.iterkeys():
146 test2
.get('g', 'foo')
148 test2
.get('b', 'bar')
149 test2
.setdefault('b', 'blah')
156 test3
['a'] = [ 0, 1, 2, 3 ]