@@ -195,9 +195,9 @@ cdef class MultiDict(_Base):
195
195
def __init__ (self , *args , **kwargs ):
196
196
self ._items = []
197
197
198
- self ._extend(args, kwargs, self .__class__.__name__ )
198
+ self ._extend(args, kwargs, self .__class__.__name__ , 1 )
199
199
200
- cdef _extend(self , tuple args, dict kwargs, name):
200
+ cdef _extend(self , tuple args, dict kwargs, name, int do_add ):
201
201
cdef tuple item
202
202
203
203
if len (args) > 1 :
@@ -207,30 +207,45 @@ cdef class MultiDict(_Base):
207
207
if args:
208
208
if hasattr (args[0 ], ' items' ):
209
209
for item in args[0 ].items():
210
- self ._add(item)
210
+ key, value = item
211
+ key = self ._upper(key)
212
+ if do_add:
213
+ self ._add(key, value)
214
+ else :
215
+ self ._replace(key, value)
211
216
else :
212
217
for arg in args[0 ]:
213
218
if not len (arg) == 2 :
214
219
raise TypeError (
215
220
" {} takes either dict or list of (key, value) "
216
221
" tuples" .format(name))
217
- if not isinstance (arg, tuple ):
218
- item = tuple (arg)
222
+ key, value = arg
223
+ key = self ._upper(key)
224
+ if do_add:
225
+ self ._add(key, value)
219
226
else :
220
- item = arg
221
- self ._add(item)
227
+ self ._replace(key, value)
228
+
229
+
230
+ for key, value in kwargs.items():
231
+ key = self ._upper(key)
232
+ if do_add:
233
+ self ._add(key, value)
234
+ else :
235
+ self ._replace(key, value)
222
236
223
- for item in kwargs.items( ):
224
- self ._add(item )
237
+ cdef _add( self , key, value ):
238
+ self ._items.append((key, value) )
225
239
226
- cdef _add(self , tuple item):
227
- self ._items.append((self ._upper(item[0 ]), item[1 ]))
240
+ cdef _replace(self , key, value):
241
+ self ._remove(key, 0 )
242
+ self ._items.append((key, value))
228
243
229
244
def add (self , key , value ):
230
245
"""
231
246
Add the key and value, not overwriting any previous value.
232
247
"""
233
- self ._add((key, value) )
248
+ self ._add(self ._upper (key) , value)
234
249
235
250
def copy (self ):
236
251
""" Returns a copy itself."""
@@ -242,7 +257,7 @@ cdef class MultiDict(_Base):
242
257
243
258
This method must be used instead of update.
244
259
"""
245
- self ._extend(args, kwargs, " extend" )
260
+ self ._extend(args, kwargs, " extend" , 1 )
246
261
247
262
def clear (self ):
248
263
""" Remove all items from MultiDict"""
@@ -252,14 +267,14 @@ cdef class MultiDict(_Base):
252
267
253
268
def __setitem__ (self , key , value ):
254
269
key = self ._upper(key)
255
- self ._delitem (key, False )
256
- self ._add(( key, value) )
270
+ self ._remove (key, False )
271
+ self ._add(key, value)
257
272
258
273
def __delitem__ (self , key ):
259
274
key = self ._upper(key)
260
- self ._delitem (key, True )
275
+ self ._remove (key, True )
261
276
262
- cdef _delitem (self , key, int raise_key_error):
277
+ cdef _remove (self , key, int raise_key_error):
263
278
cdef int found
264
279
found = False
265
280
for i in range (len (self ._items) - 1 , - 1 , - 1 ):
@@ -274,7 +289,7 @@ cdef class MultiDict(_Base):
274
289
for k, v in self ._items:
275
290
if k == key:
276
291
return v
277
- self ._add(( key, default) )
292
+ self ._add(key, default)
278
293
return default
279
294
280
295
def pop (self , key , default = _marker):
@@ -302,9 +317,8 @@ cdef class MultiDict(_Base):
302
317
else :
303
318
raise KeyError (" empty multidict" )
304
319
305
- def update (self , *args , **kw ):
306
- """ Method not allowed."""
307
- raise NotImplementedError (" Use extend method instead" )
320
+ def update (self , *args , **kwargs ):
321
+ self ._extend(args, kwargs, " update" , 0 )
308
322
309
323
def __richcmp__ (self , other , op ):
310
324
cdef MultiDict typed_self = self
0 commit comments