Interfaces (a la PEP 245 and Zope)
Terry Hancock
hancock at anansispaceworks.com
Fri Aug 1 02:00:05 EDT 2003
So, how did the chips fall on implementing interfaces in Python? :-)
I've been using the Interface module that is included in Zope, and
although, I've found it useful, there are some cases I don't seem to
find a good solution for. To illustrate, I'll just describe my current
problem:
I want to define an object which implements a variety of methods
and attributes required by Zope, and use it to wrap a simpler object
which might be written by a plugin author. The rest of my code
assumes that this plugin will conform to a given interface, so I want
to check that it does (to make life easier for the plugin developer).
I'd *like* to do something like this:
class EditorAPI(Base):
"""
Mandatory interface for Editor plugins.
"""
pass
# Defines stuff that an editor must have to satisfy the rest
# of the program.
class Editor(Folder):
"""
Zope Narya-Editor object is base for all editors.
"""
meta_type = "Narya-Editor"
__implements__ = 'EditorAPI'
def __init__(self, id, editor_core=None):
"""
Wrap an editor plug-in into a Narya-Editor instance.
"""
for key in editor_core.__dict__.keys():
setattr(self, key, getattr(editor_core, key))
if EditorAPI.isImplementedBy(self):
raise BrokenImplementation(
"Editor plugin '%s' fails implementation test." % editor_core.title)
else:
self.__implements__ = EditorAPI
BUT, .isImplementedBy(self) only seems to check to see if
self.__implements__ contains an assertion for the interface.
What I really want is a thorough check, along the lines of
what
Interface.verify.verify_class_implementation(iface, klass)
does. But that's no good, because this object wasn't created by
a simple class statement -- we're creating it dynamically in the
__init__() method.
Now of course, I could pick through the Interface module and
write a check that resembles the verification that it does, but it seems to
me that there ought to be a simpler solution (and if I were going to
do that, I should probably really be improving the Interface module
rather than putting the code in my package).
So, am I missing some existing way to do this?
TIA,
Terry
--
Terry Hancock
Anansi Spaceworks http://www.AnansiSpaceworks.com/
More information about the Python-list
mailing list