Currently if you ask a registry to singly-adapt an object to an interface, and the object you're trying to adapt implements that interface, here's what happens:
from zope.component.registry import Components c = Components() from zope.interface import Interface, implements class IFoo(Interface): pass ... class Foo(object): ... implements(IFoo) ... foo = Foo() c.queryAdapter(IFoo, foo) <None>
In order to get the object itself back from such an adaptation, you need to use the default= argument.
c.queryAdapter(IFoo, foo, default=foo) <__main__.Foo object at 0x24a3910>
This seems slightly inconsistent with the adaptation worldview imposed by getAdapter/queryAdapter. I think it would be more consistent if "c.queryAdapter(IFoo, foo)" returned foo if foo already implemented IFoo and there was no other more specific adapter registered for the IFoo/foo pair in the registry, no? Let the bikeshedding begin, - C