[Zope-dev] Zope 2 and broken interfaces

Sylvain Viollon sylvain at infrae.com
Thu Sep 23 07:26:23 EDT 2010


Hello,

   I like to refactor my code and often make broken interfaces:

   On a ZODB object I do an alsoProvide of an interface.

   Now I remove the corresponding code for that interface (and that
   object but it is not required) and I restart my server. I didn't
   moved them, I just removed them. (If I moved them I would use
   zodbupdate, and have no problem).

   But let say I need to remove that object from ZODB. Unpickling that
   object fail in the custom set_state of zope.interface with the well known
   error:

   File ".../zope.interface-3.5.3-py2.6-linux-i686.egg/zope/interface/adapter.py",
   line 470, in add_extendor for i in provided.__iro__:

   AttributeError: type object 'IKeyManager' has no attribute '__iro__'

   Because it expect to get an interface to restore the alsoProvides,
   and got a broken interface instead (which is just like a regular
   broken object).

   And you cannot access your ZODB anymore, since this broken object, with
   its broken interface is unpickled when its container is.

   I found a way 'to prevent' this error, by adding an attribute
   __iro__ which is an empty tuple to OFS.Uninstalled.BrokenClass.
   That let me load this broken object, and delete it (along with the reference
   to the broken interface).

   I think it is the good behavior, and since you cannot modify a broken
   object, if you put back the code after, your object will work again,
   with its interface provided as well.

   If we can fix this problem in Zope 2, (with this solution, or an another),
   I would be the most happy user of all :).

   Regards,

   Sylvain,

-- 
Sylvain Viollon -- Infrae
t +31 10 243 7051 -- http://infrae.com
Hoevestraat 10 3033GC Rotterdam -- The Netherlands


More information about the Zope-Dev mailing list