Christian Theune wrote:
I didn't find anything in the documentation or google on this:

I want to define an interface like:

class IMySchema(zope.interface.Interface):

Later, I want to use ore.alchemist which currently is able to take a
SQLAlchemy table description and turn it into a new interface/schema.

I want to extend this code so that I can pass it an existing interface
to modify it (update) with the schema definition.

I need this so that the interface is:

a) present in the code when reading it

b) available for ZCML configuration (it's a problem for us right now
because the database/SQLAlchemy stuff is setup up a little bit later
after executing a couple of ZCML actions)

While looking into it, we found that interfaces do not offer a public
way to modify the attributes they have, and modifying the internal data
structures would be both evil and cumbersome.

Any hints?

I would recommend creating a *sub*interface of the IMySchema on-the-fly. That way registrations for IMySchema will also apply to the subinterface, but you won't have to worry about mutating IMySchema.

This is easily possible:

  IMySchemaSub = InterfaceClass('IMySchemaSub', (IMySchema,),
                                {'field1': TextLine(), ...},
                                __doc__='...', __module__='...')

Note that if you attach the interface on persistent objects using alsoProvides/directlyProvides, you need to put the interface in a module so the ZODB can continue to import it when waking up these objects. Put it in the same module that you gave the InterfaceClass constructor (__module__).

-- -- Professional Zope documentation and training

Zope3-users mailing list

Reply via email to