[Pyrex] python callback appended to external C struct
    Elias Pschernig 
    elias at users.sourceforge.net
       
    Sun Dec  4 23:10:04 CET 2005
    
    
  
On Sun, 2005-12-04 at 13:34 -0800, Lenard Lindstrom wrote:
> I was curious myself if anyone knew of a safe way to go from a Python 
> object to void pointer and back in Pyrex. Why not use a module level 
> dictionary instead that maps object instances by object id. 
> Wrap.__new__ would add the new object to the dictionary, and a 
> Wrap.__dealloc__ would remove it. Then CWrapPositionPyrex.self is the 
> id, as an integer, and dummy_cd retrieves the actual object from the 
> dictionary and calls its cb method.
That's a great idea. Actually, I do not even need the "self" anymore at
all then.. and also not the CWrapPositionPyrex struct. I simply map the
pointer of the C struct to my python object.
I tried it out below.. but one think I'm wondering, is the <int> the
right way to do it? Without it, pyrex would complain. I simply need to
somehow use the C struct as dictionary key..
---- cfoo.h ----
typedef struct CFoo CFoo;
struct CFoo
{
    void (*cb)(CFoo *self);
};
---- cfoo.c ----
#include "cfoo.h"
/* In reality, the callback is called at arbitrary times from the C
library. */
void cfoo_callback_test(CFoo *self)
{
    self->cb(self);
}
---- foo.pyx ----
cdef extern from "cfoo.h":
    ctypedef struct CFoo:
        void *cb
    void cfoo_callback_test(CFoo *self)
dict = {}
cdef dummy_cb(CFoo *pointer):
   self = dict[<int>pointer]
   self.cb()
cdef class Foo:
    cdef CFoo cfoo
    def __new__(self):
        self.cfoo.cb = <void *>dummy_cb
        dict[<int>&self.cfoo] = self
    def callback_test(self):
        cfoo_callback_test(&self.cfoo)
---- test.py ----
import foo
class MyPythonClass(foo.Foo):
    def cb(self):
        print "hello from", self.name
my_python_object = MyPythonClass()
my_python_object.name = "my_python_object"
my_python_object.callback_test()
[PS: I hate lists who set the reply address to the poster.. I always
forget to reply to the list in that case o_O]
-- 
Elias Pschernig
    
    
More information about the Pyrex
mailing list