|  | @@ -60,6 +60,8 @@ class OrderedDict(dict, MutableMapping):
 | 
	
		
			
				|  |  |      # Those hard references disappear when a key is deleted from
 | 
	
		
			
				|  |  |      # an OrderedDict.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    __marker = object()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      def __init__(self, *args, **kwds):
 | 
	
		
			
				|  |  |          """Initialize an ordered dictionary.
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -132,23 +134,63 @@ class OrderedDict(dict, MutableMapping):
 | 
	
		
			
				|  |  |          """Return state information for pickling"""
 | 
	
		
			
				|  |  |          items = [[k, self[k]] for k in self]
 | 
	
		
			
				|  |  |          tmp = self.__map, self.__root
 | 
	
		
			
				|  |  | -        del self.__map, self.__root
 | 
	
		
			
				|  |  | +        del(self.__map, self.__root)
 | 
	
		
			
				|  |  |          inst_dict = vars(self).copy()
 | 
	
		
			
				|  |  |          self.__map, self.__root = tmp
 | 
	
		
			
				|  |  |          if inst_dict:
 | 
	
		
			
				|  |  |              return (self.__class__, (items,), inst_dict)
 | 
	
		
			
				|  |  |          return self.__class__, (items,)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    setdefault = MutableMapping.setdefault
 | 
	
		
			
				|  |  | -    update = MutableMapping.update
 | 
	
		
			
				|  |  | -    pop = MutableMapping.pop
 | 
	
		
			
				|  |  | -    keys = MutableMapping.keys
 | 
	
		
			
				|  |  | -    values = MutableMapping.values
 | 
	
		
			
				|  |  | -    items = MutableMapping.items
 | 
	
		
			
				|  |  | -    iterkeys = MutableMapping.iterkeys
 | 
	
		
			
				|  |  | -    itervalues = MutableMapping.itervalues
 | 
	
		
			
				|  |  | -    iteritems = MutableMapping.iteritems
 | 
	
		
			
				|  |  | -    __ne__ = MutableMapping.__ne__
 | 
	
		
			
				|  |  | +    def setdefault(self, key, default=None):
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            return self[key]
 | 
	
		
			
				|  |  | +        except KeyError:
 | 
	
		
			
				|  |  | +            self[key] = default
 | 
	
		
			
				|  |  | +        return default
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def update(self, other=(), **kwds):
 | 
	
		
			
				|  |  | +        if isinstance(other, dict):
 | 
	
		
			
				|  |  | +            for key in other:
 | 
	
		
			
				|  |  | +                self[key] = other[key]
 | 
	
		
			
				|  |  | +        elif hasattr(other, "keys"):
 | 
	
		
			
				|  |  | +            for key in other.keys():
 | 
	
		
			
				|  |  | +                self[key] = other[key]
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            for key, value in other:
 | 
	
		
			
				|  |  | +                self[key] = value
 | 
	
		
			
				|  |  | +        for key, value in kwds.items():
 | 
	
		
			
				|  |  | +            self[key] = value
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def pop(self, key, default=__marker):
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            value = self[key]
 | 
	
		
			
				|  |  | +        except KeyError:
 | 
	
		
			
				|  |  | +            if default is self.__marker:
 | 
	
		
			
				|  |  | +                raise
 | 
	
		
			
				|  |  | +            return default
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            del self[key]
 | 
	
		
			
				|  |  | +            return value
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def values(self):
 | 
	
		
			
				|  |  | +        return [self[key] for key in self]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def items(self):
 | 
	
		
			
				|  |  | +        return [(key, self[key]) for key in self]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def itervalues(self):
 | 
	
		
			
				|  |  | +        for key in self:
 | 
	
		
			
				|  |  | +            yield self[key]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def iteritems(self):
 | 
	
		
			
				|  |  | +        for key in self:
 | 
	
		
			
				|  |  | +            yield (key, self[key])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def iterkeys(self):
 | 
	
		
			
				|  |  | +        return iter(self)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def keys(self):
 | 
	
		
			
				|  |  | +        return list(self)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def popitem(self, last=True):
 | 
	
		
			
				|  |  |          """od.popitem() -> (k, v)
 | 
	
	
		
			
				|  | @@ -160,7 +202,7 @@ class OrderedDict(dict, MutableMapping):
 | 
	
		
			
				|  |  |          """
 | 
	
		
			
				|  |  |          if not self:
 | 
	
		
			
				|  |  |              raise KeyError('dictionary is empty')
 | 
	
		
			
				|  |  | -        key = next(reversed(self) if last else iter(self))
 | 
	
		
			
				|  |  | +        key = (last and reversed(self) or iter(self)).next()
 | 
	
		
			
				|  |  |          value = self.pop(key)
 | 
	
		
			
				|  |  |          return key, value
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -192,6 +234,9 @@ class OrderedDict(dict, MutableMapping):
 | 
	
		
			
				|  |  |                     all(_imap(_eq, self.iteritems(), other.iteritems()))
 | 
	
		
			
				|  |  |          return dict.__eq__(self, other)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    def __ne__(self, other):
 | 
	
		
			
				|  |  | +        return not (self == other)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  ############## defaultdict ##################################################
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  try:
 |