On Thu, Jan 18, 2007 at 08:53:36AM +0000, Chris Withers wrote:
> Philipp von Weitershausen wrote:
> >>If it is, then which of the following should I use to register a 
> >>generic adapter for any single object to an interface:
> >>
> >>provideAdapter(...,adapts=(None,),...)
> >
> >This one.
> Given that you can register adapters for any class, whether or not it 
> implements any interface, this doesn't work as it should:
> >>> from zope.component import provideAdapter
> >>> def adapter(*args): pass
> ...
> >>> from zope.interface import Interface
> >>> class ITest(Interface): pass
> ...
> >>> provideAdapter(adapter,adapts=(None,),provides=ITest)

It's a bit subtle.  The function you pass to provideAdapter is not the
adapter, it is an adapter factory.  Consider the difference between
classes and objects.  One is a factory for the other.  Adapters are
usually objects, and but you register classes with provideAdapter.

Now when you try to adapt anything to ITest, zope.component will call
your ``adapter`` function and then check the return value.  A return
value of None means "the adapter is not available", and results in a
TypeError you see here:

> >>> ITest(1)
> Traceback (most recent call last):
> ...
> TypeError: ('Could not adapt', 1, <InterfaceClass __main__.ITest>)

This is useful when you want to have an adapter that is available

Insert a print statement in your adapter function, and you will see that
it does get called:

  >>> from zope.component import provideAdapter
  >>> def myAdapter(*args):
  ...     print "Hi"
  >>> from zope.interface import Interface
  >>> class ITest(Interface): pass
  >>> provideAdapter(myAdapter,adapts=(None,),provides=ITest)
  >>> ITest(1)
  Traceback (most recent call last):
    File "<stdin>", line 1, in ?
  TypeError: ('Could not adapt', 1, <InterfaceClass __main__.ITest>)

> >I have no idea what a "generic" adapter is, but the zope.component API 
> >docs (== interfaces) are certainly complete in this sense. There are 
> >also doctests.
> Where can I find the docs and interfaces you mention above? I looked 
> through both zope.interface and zope.component and obviously missed them :-(

src/zope/component/README.txt would be my guess.  I do not remember
what's inside, I learnt adapters by osmosis and occasional studying of
the source code.

Marius Gedminas
Change is inevitable, except from a vending machine.

Attachment: signature.asc
Description: Digital signature

Zope3-dev mailing list
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com

Reply via email to