[Zope-dev] zope.component: calling an Interface and calling queryAdapter give differing results

Philipp von Weitershausen philipp at weitershausen.de
Tue Aug 19 15:48:48 EDT 2008


Shane Hathaway wrote:
> Chris Withers wrote:
>>  From a user's perspective, this makes no sense:
>>
>>  >>> from zope.interface import implements,Interface
>>  >>> from zope.component import queryAdapter
>>  >>> class ISomething(Interface): pass
>> ...
>>  >>> class MyClass: implements(ISomething)
>> ...
>>  >>> m = MyClass()
>>
>> Right, so this does make sense:
>>
>>  >>> ISomething(m)
>> <__main__.MyClass instance at 0x00BED6E8>
>>
>> This does not:
>>  >>> repr(queryAdapter(m,ISomething))
>> 'None'
> 
> Looks like a bug to me.  If the object passed as the first argument to 
> queryAdapter() implements the interface passed as the second argument, I 
> believe queryAdapter() should return the object, regardless of any 
> component registrations.

No, it's not a bug. This is in fact a feature (like it or not). 
{query|get}Adapter will always try to look up an adapter, whether or not 
the object provides the interface. So the behaviour Chris observed is 
indeed intended. I agree it could be documented better.


More information about the Zope-Dev mailing list