[Zope3-dev] Idea: Failure to lookup adapters

Marius Gedminas mgedmin at b4net.lt
Tue Jan 16 08:23:31 EST 2007


On Tue, Jan 16, 2007 at 08:36:48AM +0100, Christian Theune wrote:
> Am Montag, den 15.01.2007, 17:25 -0200 schrieb Sidnei da Silva:
> > One of the most common issues that I've faced, and watched several
> > people struggle with, during Zope 3 development is to figure why a
> > certain adapter is not found, or why a certain other adapter is found
> > instead of the one you are expecting.
...
> > One of the ideas that occurred me was that in debug mode we could
> > create a wrapper around the to-be-returned adapter and stuff some
> > trace information in there to help diagnose possible issues. Or maybe
> > we could just use the logging framework to output some information.
> > 
> > The kind of info I'm looking for is something along the lines:
> > 
> >   'We've tried to look up an adapter for (ISomething, ITheOther) but
> > none was found'
> >   'Found an adapter for IFoo, which is a base class for the IBar
> > interface requested. No adapter has been found for the most-specific
> > interface IBar'
>
> Yes please. =)
> 
> I'd love some debugging support for that as well. I like the idea of a
> log that gives you enough input to reason about what the CA did to
> derive its decision.
>
> In an advanced step, something interactive might be worthwhile to allow
> poking into the registrations conveniently.

Perhaps a useful question to ask here is "why wasn't my adapter chosen?"

  $ bin/debugzope
  >>> from zope.component.introspection import explainAdapter
  >>> from mypackage import MyAdaper, IMyDesiredInterface
  >>> my_obj = app.root()['somefolder']['someobj']
  >>> explainAdapter(my_obj, IMyDesiredInterface, desired_adapter=MyAdapter)
  'MyAdapter is registered for IFoo, but context does not provide IFoo.'

explainAdapter is probably a bad name for this.  Maybe the whole API is
bad.  Maybe it would be more useful to list all adapters that could
adapt your object to the desired interface, and list them in the order
of specificness:

  >>> for reg in matchingAdapters(my_obj, IMyDesiredInterface):
  ...     print reg.factory, reg.required
  <class somemodule.SomeGenericAdapter> (<interface IFooBase>, )
  <class somemodule.MyAdapter> (<interface IFoo>, )
  <class somemodule.SomeEvilAdapter> (<interface IMoreSpecificFoo>, )

Marius Gedminas
-- 
... Another nationwide organization's computer system crashed twice in less
than a year. The cause of each crash was a computer virus....
                -- Paul Mungo, Bryan Glough  _Approaching_Zero_
(in 1986 computer crashes were something out of the ordinary.  Win95 anyone?)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mail.zope.org/pipermail/zope3-dev/attachments/20070116/346d9724/attachment.bin


More information about the Zope3-dev mailing list