[Zope3-dev] Re: reasonable syntax for multi-adaptation
Jim Fulton
jim at zope.com
Wed Sep 26 11:29:53 EDT 2007
On Sep 26, 2007, at 11:08 AM, Brandon Craig Rhodes wrote:
> Jim Fulton <jim at zope.com> writes:
>
>> On Sep 26, 2007, at 10:04 AM, Brandon Craig Rhodes wrote:
>>
>>> Instead, multi-adaption should look like this:
>>>
>>> IFoo(multi=(obj1, obj2))
>>> IFoo(multi=(obj1, obj2), name='site_foo')
>>
>> Ah, using keyword arguments to get around limitations (especially
>> backward compatibility issues) with the current API is a neat idea.
>> If we were going to do this though, I think a method syntax would be
>> cleaner. As in:
>>
>> IFoo.adapt([ob1, ob2], 'site_foo', None)
>
> -1.
>
> Unfortunately the singular verb "adapt" makes it look like normal
> adaptation is what is being called for - it looks here like you are
> trying to adapt a list to the IFoo interface.
>
> Maybe ".multiadapt()"?
>
>> Note that IFoo(ob) has some special semantics that don't apply to
>> the multi- or named-adapter case.
>
> Agreed! The semantics are different. But mightn't we simply document
> this difference between single- and multi-adaptation everywhere we
> need to, rather than letting it force us into splitting the adapter
> syntax into two unwieldy pieces?
I don't consider either unwieldy.
...
> So, I am not sure that I see yet the problem with "mixing APIs".
The semantics of the call would change in fundamental ways based on
the arguments passed. I think this is very bad. If you disagree,
sorry. :)
> For me, the essential issue is that in both single- and multi-
> adaptation you are returned an instance of an adapter that has been
> instantiated with the objects you are adapting. Both of these
> syntaxes:
>
> IFoo(x)
> IBar(multi=(x,y))
Actually, that is not the case. If x already provides IFoo, then in
the first case, the existing object is retuned. Nothing is
instantiated. OTOH, in:
getMultiAdapter([x], IFoo)
or
getAdapter(x, IFoo)
either there is an error or some factory will be called. x won't be
returned unless the factory happens to return it.
...
>> An added complication is that interfaces don't provide adaption
>> directly, but via a hook. The existing hook api wouldn't work for
>> mult or named adaptation, so a new hook would be needed.
>
> I had assumed that IBar(multi=(obj1, obj2)) would simply dispatch to
> the existing getMultiAdapter() call; how, exactly, would hooks get
> involved and complicate things? Feel free to just cite a line number
> and tell me to go read, all I need is a pointer to get started
> understanding this.
zope.interface does *not* depend on zope.component. It only does
adaptation the way it does because it provides a hook that
zope.component fills. Other people are using zope.interface with
different adaptation schemes.
Adding multi- or named- adaption support would require a similar hook.
I don't really have time to continue this discussion. You made a
reasonable proposal, but for various reasons I've tried to explain, I
don't support it.
Jim
--
Jim Fulton
Zope Corporation
More information about the Zope3-dev
mailing list