[PEAK] dispatch.add_assignment_advisor
    Phillip J. Eby 
    pje at telecommunity.com
       
    Fri Dec  3 15:35:04 EST 2004
    
    
  
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.  :)
>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.
>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.
    
    
More information about the PEAK
mailing list