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

Brandon Craig Rhodes brandon at rhodesmill.org
Wed Sep 26 21:33:43 EDT 2007


Tres Seaver <tseaver at palladion.com> writes:

> Martijn Faassen wrote:
>
>> IFoo.adapt() for normal adaptation
>> IFoo.multiadapt() for multi adaptation
>
> I'd rather have 'adapt' take *args for the contexts, and keywords
> for extras (like name).

And you could make the "default=" another possible extra!  In which
case our proposals at the moment compare something like this:

 Brandon
      Utility?              IFoo()
      Single adaptation     IFoo(a)
      ... with default      IFoo(a, default=y)
      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)

 Martijn/Tres
      Utility               IFoo.adapt()
      Single adaptation     IFoo.adapt(a)
      ... with default      IFoo.adapt(a, default=y)
      Multi adaptation      IFoo.adapt(a,b)
      ... with default      IFoo.adapt(a,b, default=y)
      Named multi adapter   IFoo.adapt(a,b, name='z')
      ... with default      IFoo.adapt(a,b, name='z', default=y)

Well, I have to admit, yours are a lot prettier.  The word "adapt"
takes no more characters than my "multi", and parenthesis disappear!
And though I might quibble that "adapt()" would be better spelled
"utility()", there is a nice symmetry about your idea.

 - Both patterns make it explicit to anyone reading the code when a
   default value is being passed, which should vastly reduce surprise.

 - Mine feels more natural and Pythonic to people who, like PvW in his
   book, think of adaptation as being like casting.

 - On the other hand, adaptation is *not* casting, and having to spell
   out "adapt" really makes for explicit code!  And the very natural
   handling of single or multiple *args in your scheme is very pretty.

 - My scheme requires the coder to remember that multi-adaption is
   "done differently" than normal adaption; yours does not.

 - My scheme, by requiring the magic keyword "multi=", leaves the user
   in the same dratted danger as before - that he will call IFoo(a, b)
   and think that he's multiply adapting!

Given those last two points, I must abandon my earlier proposal and
respond to that of Martijn and Tres with:

+1

-- 
Brandon Craig Rhodes   brandon at rhodesmill.org   http://rhodesmill.org/brandon


More information about the Zope3-dev mailing list