[ZODB-Dev] How can I append Persistent mechanism to OrderedDict class ?

Stéphane Klein stephane at harobed.org
Fri Sep 16 03:54:19 EST 2011


Le 16/09/2011 10:07, Stéphane Klein a écrit :
> Le 30/01/2011 12:12, Vincent Pelletier a écrit :
>> Le dimanche 30 janvier 2011 09:52:32, Stéphane Klein a écrit :
>>> How can I append Persistent mechanism to this OrderedDict class ?
>>
>> You should probably read the code for PersistentMapping[1] and adapt it to
>> OrderedDict's API.
>>
>> [1]
>> http://svn.zope.org/ZODB/trunk/src/persistent/mapping.py?rev=113734&view=markup
>>
>
> Hi,
>
> I'll try that :
>
>       from collections import OrderedDict
>       from persistent import Persistent
>
>       class PersistentOrderedDict(OrderedDict, Persistent):
>           pass
>
> but I've this error :
>
>       TypeError: Error when calling the metaclass bases
>           multiple bases have instance lay-out conflict
>
> Then, I can't do like "persistent.mapping.PersistentMapping"
>
>       class PersistentMapping(UserDict.IterableUserDict,
> persistent.Persistent)"
>
> I need to create
> PersistentOrderedDict that need to be a "proxy" class over OrderedDict,
> and a child on Persistent ?

I've just created this class, what do you about ?

from collections import OrderedDict
from persistent import Persistent

class PersistentOrderedDict(Persistent):
     def __init__(self, *args, **kwds):
         self.__data = OrderedDict(*args, **kwds)

     def __setitem__(self, key, value, PREV=0, NEXT=1, 
dict_setitem=dict.__setitem__):
         res =  self.__data.__setitem__(key, value, PREV=0, NEXT=1, 
dict_setitem=dict.__setitem__)
         self._p_changed = 1
         return res

     def __delitem__(self, key, PREV=0, NEXT=1, 
dict_delitem=dict.__delitem__):
         res = self.__data.__delitem__(key, PREV=0, NEXT=1, 
dict_delitem=dict.__delitem__)
         self._p_changed = 1
         return res

     def __iter__(self, NEXT=1, KEY=2):
         return self.__data.__iter__(NEXT=1, KEY=2)

     def __reversed__(self, PREV=0, KEY=2):
         return self.__data.__reversed__(PREV=0, KEY=2)

     def __reduce__(self):
         return self.__data.__reduce__()

     def clear(self):
         return self.__data.clear()

     def setdefault(self, key, default=None):
         if key in self.__data:
             return self.__data[key]

         self.__data[key] = default
         self._p_changed = 1
         return default

     def update(self, other):
         res = self.__data.update(other)
         self._p_changed = 1
         return res

     def pop(self, key, default=None):
         res = self.__data.pop(key, default)
         self._p_changed = 1
         return res

     def keys(self):
         return self.__data.keys()

     def values(self):
         return self.__data.values()

     def items(self):
         return self.__data.items()

     def iterkeys(self):
         return self.__data.iterkeys()

     def itervalues(self):
         return self.__data.itervalues()

     def iteritems(self):
         return self.__data.iteritems()

     def __ne__(self, other):
         return self.__ne__(other)

     def viewkeys(self):
         return self.__data.viewkeys()

     def viewvalues(self):
         return self.__data.viewvalues()

     def viewitems(self):
         return self.__data.viewitems()

     def popitem(self, last=True):
         return self.__data.popitem(last=last)

     def __repr__(self):
         return self.__data.__repr__()

     def copy(self):
         return self.__data.copy()

     @classmethod
     def fromkeys(cls, iterable, value=None):
         return OrderedDict.fromkeys(iterable, value)

     def __eq__(self, other):
         return self.__data.__eq__(other)


-- 
Stéphane Klein <stephane at harobed.org>
blog: http://stephane-klein.info
Twitter: http://twitter.com/klein_stephane
pro: http://www.is-webdesign.com



More information about the ZODB-Dev mailing list