[Zope-dev] improving the utility and adapter lookup APIs

Tres Seaver tseaver at palladion.com
Wed Nov 25 15:52:23 EST 2009

Hash: SHA1

Brian Sutherland wrote:
> On Wed, Nov 25, 2009 at 05:17:17PM +0100, Thomas Lotze wrote:
>> What about a simple and consistent API for all components including
>> utilities, adapters and multiadapters:
>> IFoo()
>> IFoo(x)
>> IFoo(x, y)
> This also doesn't allow you to use this (anti?)pattern:
> class Foo:
>     implements(IFoo)
>     def do_something(self):
>         # custom behaviour here
>         default_foo_adapter = getAdapter(self, IFoo)
>         return default_foo_adapter.do_something() # fallback to default behaviour
> It may not be very theoretically correct, but it's something I find very
> useful when writing IPublishTraverse implementing classes for
> zope.publisher to traverse over. It saves me from having to inherit from
> the default traverser.

Hmm, I may be missing something here, but if Foo implements IFoo, then
the getAdapter lookup for it will short circuit, leading you into
infinite recursion.  Except that it doesn't::

  $ bin/virtualenv-2.6 --no-site-packages /tmp/brian
  $ cd /tmp/brian
  $ bin/easy_install zope.component
  $ bin/python
  >>> from zope.interface import Interface
  >>> from zope.interface import implements
  >>> class IFoo(Interface):
  ...     pass
  >>> from zope.component import getAdapter
  >>> class Foo:
  ...     implements(IFoo)
  >>> foo = Foo()
  >>> IFoo(foo) is foo
  >>> getAdapter(foo, IFoo) is foo
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  zope.component.interfaces.ComponentLookupError: (<__main__.Foo
    instance at 0xb7d0690c>, <InterfaceClass __main__.IFoo>, u'')

which strikes me as wildly disjoint:  the IFoo behavior is "expected"
(short-circuit the lookup if the object already provides the interface),
while the getAdapter behavior is a puzzlement.

- --
Tres Seaver          +1 540-429-0999          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org


More information about the Zope-Dev mailing list