Re: PyProtocols: TypeError: Ambiguous adapter choice

Sergey Schetinin <[email protected]> Fri, 10 Jul 2009 20:13:13 +0300
Newsgroups gmane.comp.python.peak
Message-ID <[email protected]>
2009/7/10 luper rouch <[email protected]>:
> 2009/7/10 Sergey Schetinin <[email protected]>:
>> 2009/7/10 luper rouch <[email protected]>:
>>> The following code produces an error:
>>>
>>> TypeError: ('Ambiguous adapter choice', <class
>>> '__main__.FooOneAsFoo'>, <class '__main__.FooTwoAsFoo'>, 2, 2)
>>>
>>> --- code begins ---
>>>
>>> from protocols import Interface, advise
>>>
>>> class IFoo(Interface):
>>>    pass
>>>
>>> class IFooOne(Interface):
>>>    pass
>>>
>>> class IFooTwo(Interface):
>>>    pass
>>>
>>> class FooOneAsFoo(object):
>>>    advise(
>>>            instancesProvide=[IFoo],
>>>            asAdapterForProtocols=[IFooOne]
>>>        )
>>>
>>> class FooTwoAsFoo(object):
>>>    advise(
>>>            instancesProvide=[IFoo],
>>>            asAdapterForProtocols=[IFooTwo]
>>>        )
>>>
>>> class ComposedFoo(object):
>>>    advise(
>>>            instancesProvide=[IFooOne, IFooTwo]
>>>        )
>>>
>>> --- code ends ---
>>>
>>> Why is it ambiguous to write for example:
>>>
>>> foo = FooOneAsFoo(ComposedFoo())
>>>
>>> foo has an IFoo interface, adapted from the IFooOne interface of ComposedFoo.
>>> _______________________________________________
>>> PEAK mailing list
>>> [email protected]
>>> http://www.eby-sarna.com/mailman/listinfo/peak
>>>
>> Are you sure it's the "foo = FooOneAsFoo(ComposedFoo())" producing the
>> error? Could it actually be IFoo(ComposedFoo()) ?
>>
>
> Actually it's the ComposedFoo definition that triggers the error.
>

I guess I'm wrong, but I remember adapter graph being checked for
ambiguity when used, not on declarations. PEAK-Rules rebuilds indexes
when first used, so maybe that's what I'm confusing it with.

Anyway, the adaptation graph is ambiguous, because there are two
adapters from ComposedFoo type to IFoo protocol with the same weight.
I'm still not sure why you get the error if not trying to do that
adaptation.