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

Chris Withers chris at simplistix.co.uk
Fri Aug 22 10:11:47 EDT 2008


Marius Gedminas wrote:
> On Tue, Aug 19, 2008 at 11:19:12PM +0100, Chris Withers wrote:
>> However, how should I go about adapting an object to an interface where 
>> there may or may not be an adapter registered?
> 
> obj = ISomething(otherobj, None)

Ah, okay. Now I remember. I've often wanted to be able to do:

obj = ISomething(obj1,0bj2,0-bj3) to get a multiadapter.
Now that I can see the above, I know why that's not possible.

So what you describe above actually works currently?

>> The natural way would seem to be:
>>
>> obj = ISomething(otherobj,default=None)
> 
> I like this version.  It's much clearer.

What's the default parameter currently called then?

> I think that was about making ISometing(foo, bar) do a multi-adapter
> lookup instead of the current semantics (using bar as the default).

indeed, correct you are :-)

> It's also what I expected, and Jim managed to convince me I was wrong.

Fine, now try and convince me ;-)

> Well, almost.  I still think there's a smell if something doesn't work
> the way people expect, even if it all seems very elegant after a long
> protracted explanation.

Nothing that requires a protracted explanation is elegant.

> FWIW, there's another difference between ISomething(foo) and
> getAdapter(foo, ISomething):
> 
>     class SampleObject(object):
>         def __conform__(self, iface):
>             if iface is ISomething:
>                 return self.something
> 
>     obj = SampleObject()
>     obj.something = SomethingElse()
> 
> ISomething(obj) will return obj.something.
> 
> getAdapter(obj, ISomething) will raise a ComponentLookupError.

I have no idea what __conform__ is, so I guess I don't mind too much ;-)

Chris

-- 
Simplistix - Content Management, Zope & Python Consulting
            - http://www.simplistix.co.uk


More information about the Zope-Dev mailing list