[Zope3-dev] Re: reasonable syntax for multi-adaptation

Dominik Huber dominik.huber at perse.ch
Thu Sep 27 09:48:46 EDT 2007


Marius Gedminas wrote:
> On Wed, Sep 26, 2007 at 09:09:37PM -0400, Tres Seaver wrote:
>> Why does the caller care?  She just wants an object which will provide
>> the 'IFoo' contract on behalf of the passed context.  If 'x' is capable
>> of providing 'IFoo' without help, then failing (or worse, returning a
>> less-specific factory result) when calling 'getAdapter' is the Wrong
>> Thing (a "least surprise" violation, if nothing else).
> 
> FWIW it was a big surprise to me when I discovered that IFoo(x) has
> different semantics from getAdapter(x, IFoo).

That's true. I spent hours debugging errors related to the adaption 
mechanism. The different api's and its differing lookup mechanism is 
only one piece in the collection of obscurities. Other pieces are caused 
by different frameworks that using the underlying adaption mechanism: 
One problem is that sometimes implemented or adapted objects got treated 
in different way (ex. form-framework: it's modified event notification). 
Another problem is that an adapted context might not locatable if its 
adapter does not implement ILocation or does not get location proxied 
implicitly (ex. local/global security).

All those examples and solutions are based on assumptions about 
implementations and that is causing the adaption-voodoo.

Lookup by interfaces and therefore the adaption asserts a higher logical 
abstraction layer which should encapsulate such implementation details 
(like adaption-, localisation- and lookup-mechanism) in a *reasonable* 
way. If code that relies on this abstraction has to differ the 
underlying mechanism and the kind of the result, it is *necessary* to 
provide an api that covers those needs - IOW why should the caller care 
or make voodoo if he gets what he wants?

It would be great, if we could handle other adaption-derivations by the 
proposed unified, reasonable adaption-api too.

Example using the IFoo()-syntax:

Single adaptation     IFoo(a)
... with default      IFoo(a, default=y)
... assert location   IFoo(a, default=y, locate=True)
... no conform-call   IFoo(a, default=y, coform=False)
... force adaption    IFoo(a, default=y, force_adaption=True)
... explicit context  IFoo(a, context=specific_context)

Multi adaptation      IFoo(multi=(a,b))
... with default      IFoo(multi=(a,b), default=y)
Named multi adapter   IFoo(multi=(a,b), name='z')
... with default      IFoo(multi=(a,b), name='z', default=y)
... assert location   IFoo(multi=(a,b), default=y, locate=True)


Regards,
Dominik


More information about the Zope3-dev mailing list