[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