[Zope-dev] A summary of "Interfaces vs ZCA concepts"

Brian Sutherland brian at vanguardistas.net
Fri Dec 18 02:51:25 EST 2009


On Thu, Dec 17, 2009 at 04:59:12PM +0100, Thomas Lotze wrote:
> Martijn Faassen wrote:
> > Their behavior should be:
> > 
> > IFoo.adapt(context) raises LookupError, unless the context provides IFoo,
> > in which case it returns context.
> > 
> > IFoo.adapt(context, default=default) returns default unless context
> > provides IFoo, in which case it returns context.
> > 
> > IFoo.utility() raises LookupError.
> > 
> > IFoo.utility(default=default) returns default
> 
> I think looking at that API explains why we have trouble with having stub
> methods defined by zope.interface: these methods contain enough
> information about component concepts to blur the distinction between
> zope.interface and zope.component, but they still lie about the actual
> method signature. In that sense, these stubs would be worse than
> zope.interface not documenting the methods at all.
> 
> In my and Wolfgang's opinion, we can either have zope.interface implement
> methods with the real contract, which would mean defining the full
> concepts of the ZCA within zope.interface (if not their implementation),
> or not even have method stubs in zope.interface and leave the whole
> business of defining specialised uses of interfaces to other packages such
> as zope.component.

I like things to fail noisily and loudly unconfigured and give good
information about what's wrong.  So my preferred implementation of a
stub "utility" function on Interface is:

    def utility(default=None):
        """Lookup a utility for this interface.

        A utility is a ${long explanation of utility concept}.

        This method behaves like ${explanation of utility method contract}. 
        """
        raise NotImplementedError("""No Utility lookup mechanism has been configured.
            If you wish to use utility lookups on interfaces, please configure a
            package that contains this mechanism. Packages known to
            implement this are:
                zope.component
            """)

I agree that this encodes in the zope.interface package concepts from
zope.component. I feel uncomfortable about that. But I feel more
uncomfortable with magic where it is impossible to find out what is
going on by reading the code.

-- 
Brian Sutherland


More information about the Zope-Dev mailing list