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 conditionally. 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) Hi 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.
signature.asc
Description: Digital signature
_______________________________________________ Zope3-dev mailing list Zope3-dev@zope.org Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com