[Pyrex] Passing c pointers to a class method

John (J5) Palmieri johnp at redhat.com
Tue May 4 22:19:04 CEST 2004


On Tue, 2004-05-04 at 15:08, Phillip J. Eby wrote:
> At 02:54 PM 5/4/04 -0400, John (J5) Palmieri wrote:
> >On Tue, 2004-05-04 at 14:43, Phillip J. Eby wrote:
> > > At 02:38 PM 5/4/04 -0400, John (J5) Palmieri wrote:
> > > >Hello all,
> > > >
> > > >How come something like this works:
> > > >
> > > >cdef test (void *ptr):
> > > >    pass
> > > >
> > > >test (somepointer)
> > > >
> > > >Yet this spits out "Cannot convert 'void (*)' to Python object":
> > > >
> > > >cdef class testclass:
> > > >     cdef test (self, void *ptr):
> > > >         pass
> > > >
> > > >mytest=testclass()
> > > >mytest.test(somepointer)
> > >
> > >
> > > 'test' isn't a classmethod, that's why.
> > >
> > > Is there even such a thing as a cdef classmethod?
> >
> >Ok, so is there a way to pass a C pointer into a method?
> 
> Oops.  I misread your question as having to do with classmethods, not 
> instance methods.  The correct answer is:
> 
> cdef class testclass:
>       cdef test (self, void *ptr):
>           pass
> 
> cdef testclass mytest
> mytest = testclass()
> mytest.test(NULL)
> 
> The actual problem with your code was that without 'cdef testclass mytest', 
> Pyrex has no way to know that 'mytest' will always hold an instance of 
> 'testclass', and so it cannot invoke the C method.
> 
> Note, by the way, that this will only work from Pyrex code, not Python code.

Thats all I need.  It seems to have worked. Thanks.

-- 
John (J5) Palmieri
Associate Software Engineer
Desktop Group
Red Hat, Inc.
Blog: http://martianrock.com





More information about the Pyrex mailing list