[Zope-dev] Interfaces vs ZCA concepts

Matthias Lehmann mat at matlehmann.de
Tue Dec 15 11:58:34 EST 2009


Am Dienstag 15 Dezember 2009 17:16:12 schrieb Thomas Lotze:
> So we've decided to let interfaces grow `adapt` and `utility` methods. I've
> written a simple and straight-forward implementation of them (see the
> tlotze-component-API branches of zope.interface and zope.component) that is
> closely modelled on the exisiting `__call__`. In particular, the new
>  methods use component hooks which are like adapter hooks but with a richer
>  set of call parameters. There are a few tests for the new methods as well,
>  so everything should be fine.
> 
> Except that I don't like the implications now that I have actually written
> down the code. I'll describe the problem I see and then suggest an idea
>  that I don't think we've been considering in the discussion two weeks ago:
> 
> We're intentionally leaking the concept of utilities to zope.interface.
> Assuming we're entirely fine with this, we still need to decide how much of
> the particulars of the ZCA we want to bring along: named components, lookup
> contexts, the ComponentLookupError. My current implementation tries to
> introduce enough generic behaviour into the `adapt` and `utility` methods
>  so that they don't cause too obvious (conceptual) dependencies of
>  zope.interface on zope.component:
> 
> * `adapt` and `utility` don't define particular optional arguments but pass
>   all keyword parameters except for `default` to the component hook which,
>   being implemented by zope.component, keeps the knowledge about named
>   adapters and lookup contexts within the latter package.
> 
> * The hook invokes the `query*` functions to play nice with any other
>   component hooks and the interface methods raise a TypeError if all of
>  them fail to find a component.
> 
> However, the generic behaviour gets in our way: the method signatures
>  become useless and hooks lose the possibility of raising useful
>  exceptions.
> 
> I've tried some variations but as long as the `adapt` and `utility` methods
> are actually implemented by zope.interface, it will always come down to a
> compromise that either renders the new methods unusable with anything
>  that's not very much like zope.component, or makes for a half-hearted copy
>  of the functionality we currently have in the zope.component API.
> 
> I discussed this a bit with Wolfgang as we both don't like this kind of
> compromise in such core functionality. We came up with the idea that a
>  clean solution would be to keep any implementation of the two methods out
>  of zope.interface and rather inject them into the interface API by code
>  kept entirely within zope.component. We do realise how close to the
>  concept of monkey-patching this comes, but maybe it wouldn't be so bad if
>  we could do it in a more structured way (being intentionally vague here
>  yet).
> 
> In particular, keeping the concrete `adapt` and `utility` methods out of
>  the core implementation of interfaces would address the concern raised by
>  somebody on this list that we were going to tailor zope.interface too much
>  to the needs of the Zope ecosystem. Uses of interfaces other than
>  adaptation and component lookup could get convenience methods registered
>  by the same mechanism zope.component would end up employing, which is a
>  big conceptual advantage from my point of view.
> 
> What do people think of this?
> 
Conceptually, this sounds a lot like what I was thinking when I read the 
discussion, a week or two ago. 
So I am very much like the idea - to let an interface be an interface without 
bringing it into tight coupling to other zope-concepts.

So the remaining question is, how to implement this in a clean way and still 
keeping the usage simple and readable.

Something like 
IFoo.do.adapt(x,y) and IFoo.do.get_utility() (as well as 
IFoo.do.something_completely_different() )
would be possible, but somewhat unusual ...

Mat


More information about the Zope-Dev mailing list