[Zope-dev] Interfaces vs ZCA concepts

Chris McDonough chrism at plope.com
Tue Dec 15 17:32:15 EST 2009


I wonder if maybe something like (notionally):

class InterfaceBase(object):
     @classmethod
     def add_more_api(cls, **kw):
         cls.__dict__.update(kw)


- C

Leonardo Rochael Almeida wrote:
> Funny you should mention this, I've got this idea bugging for a few
> weeks now, after the last thread:
> 
> Have the zope.interface package expose a single overridable hook:
> 
> def getInterfaceAttribute(iface, name, default):
> 
> This method would be called by any attempt to look up an interface
> attribute that isn't provided by zope.interface itself. For example:
> 
>   IFoo.adapter(bar, default=baz)
> 
>   Would be the almost the same as:
> 
>   getInterfaceAttribute(IFoo, 'adapter', default=somemarker)(bar, default=baz)
> 
> That is unless getInterfaceAttribute(IFoo, 'adapter') returned the
> passed-in marker which would instruct zope.interface to raise an
> AttributeError instead.
> 
> In turn, "zope.component" could then provide a getInterfaceAttribute()
> implementation that called:
> 
>   getAdapter(IFoo, interface=IInterfaceMethod, name='adapter')
> 
> Yes, the first parameter above is the original interface. The
> IInterfaceMethod is an interface defining __call__(*args, **kw)
> 
> This idea would also allow one to define named adapters for
> IInterfaceMethod to, for instance, "__call__" or "__add__", such that
> the semantics of "IFoo(...)" or "IFoo + IBar" could also be changed.
> 
> Perhaps entry points could be used to provide getInterfaceAttribute
> implementations, and if multiple entry points are present, each would
> be called in turn to attempt to provide the attributes of an
> interface, but maybe this is too much flexibility...
> 
> Just an idea...
> 
> Cheers, Leo
> 
> On Tue, Dec 15, 2009 at 14:16, Thomas Lotze <tl at gocept.com> wrote:
>> 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?
>>
>> --
>> Thomas
>>
>>
>>
>> _______________________________________________
>> Zope-Dev maillist  -  Zope-Dev at zope.org
>> https://mail.zope.org/mailman/listinfo/zope-dev
>> **  No cross posts or HTML encoding!  **
>> (Related lists -
>>  https://mail.zope.org/mailman/listinfo/zope-announce
>>  https://mail.zope.org/mailman/listinfo/zope )
>>
> _______________________________________________
> Zope-Dev maillist  -  Zope-Dev at zope.org
> https://mail.zope.org/mailman/listinfo/zope-dev
> **  No cross posts or HTML encoding!  **
> (Related lists - 
>  https://mail.zope.org/mailman/listinfo/zope-announce
>  https://mail.zope.org/mailman/listinfo/zope )
> 



More information about the Zope-Dev mailing list