[PEAK] Re: dispatch.add_assignment_advisor

Thomas Heller theller at python.net
Fri Dec 3 15:58:56 EST 2004


"Phillip J. Eby" <pje at telecommunity.com> writes:

> At 09:19 PM 12/3/04 +0100, Thomas Heller wrote:
>>[Repost - the first one is still in the list-admin's queue because I
>>wasn't subscribed, sorry for that]
>>
>>Only for fun, I'm experimenting with dispatch.add_assignment_advisor and
>>sick decorators.
>
> They don't look sick to me, they look quite healthy and useful,
> although I personally prefer to put them in [] so that they're more
> visibly magical.  :)

We'll see if I can put them to actual use.

>>The cool thing is that it also works with Python 2.3, and that it also
>>is able to decorate classes (much more convenient than metaclasses,
>>especially for multiple inheritence, where very soon metaclass conficts
>>arise).
>>
>>Unfortunately, the experiment didn't go as smooth as I first expected.
>>Consider this code (cominterface and commethod are 'decorators' which
>>call add_assignment_advisor (the correct term would probably be 'which
>>add an assignment advisor):
>>
>>cominterface(uuid = "{00000000-0000-0000-C000-000000000046}")
>>class IUnknown(object):
>>
>>     commethod(index=1,
>>               restype = HRESULT,
>>               argtypes = [POINTER(GUID), POINTER(c_void_p)])
>>     def QueryInterface(self, interface):
>>         "Query for another interface"
>>
>>     commethod(index=2, restype=c_long)
>>     def AddRef(self):
>>         "Increase the reference count"
>>
>>     commethod(index=1, restype=c_long)
>>     def Release(self):
>>         "Decrease the reference count"
>>
>>The problem is that the IUnknown methods are created first, and the
>>commethod decorator is called.
>>After that, the IUnknown type itself is created, and I expected that the
>>cominterface decorator would be called - but it isn't.
>
> I would have expected that too, but I haven't really tested assignment
> advisors with classes, because we already had class advisors for that.

It works as expected when all the method decorators are removed.

>>Any idea how to make this work as expected?
>
> Use 'protocols.advice.addClassAdvisor' instead, and move the
> 'cominterface' call inside the class body.  Note, however, that
> addClassAdvisor has a different callback signature; the callback
> accepts one argument (the incoming class) and must return the desired
> output class.

Cool.  I cannot pretend to understad addClassAdvisor code, but it seems
you create a __metaclass__ and let it do the magic.

Thanks,

Thomas




More information about the PEAK mailing list