[Numpy-discussion] Getting C-function pointers from Python to C

Travis Oliphant teoliphant at gmail.com
Wed Apr 11 17:23:22 EDT 2012


>>>> Thoughts?
>>> 
>>> I really hope we can find some project-neutral common ground, so that lots of tools (Cython, f2py, numba, C extensions in NumPy and SciPy) can agree on how to "unbox callables".
>>> 
>>> A new extension type in NumPy would not fit this bill I feel. I've created a specification for this; if a number of projects (the ones mentioned above) agree on this or something similar and implement support, we could propose a PEP and do it properly once it has proven itself.
>>> 
>>> http://wiki.cython.org/enhancements/cep1000
>>> 
>>> In Cython, this may take the form
>>> 
>>> def call_callback(object func):
>>>    cdef double (*typed_func)(int)
>>>    typed_func = func
>>>    return typed_func(4)
>>> 
>>> ...it would be awesome if passing a Numba-compiled function just worked in this example.
>> 
>> Yes, I think we should go the Python PEP route.   However, it will take some time to see that to completion (especially with ctypes already in existence).   Dag, this would be a very good thing for you to champion however ;-)
> 
> I was NOT proposing a PEP.
> 
> The spec is created so that it can be implemented *now*, by the tools 
> "we" control (and still be very efficient). A "sci-PEP", if you will; a 
> mutual understanding between Cython, NumPy, numba (and ideally f2py, 
> which already has something similar, if anyone bothers).
> 
> When this is implemented in all the tools we care about, we can propose 
> something even nicer as a PEP, but that's far down the road; it'll be 
> another couple of years before I'm on Python 3.

Perfect :-)  We are on the same page....

> 
>> 
>> In the mean-time, I think we could do as Robert essentially suggested and just use Capsule Objects around an agreed-upon simple C-structure:
>> 
>> 	int   id   /* Some number that can be used as a "type-check" */
>> 	void *func;
>> 	char *string;
>> 
>> We can then just create some nice functions to go to and from this form in NumPy ctypeslib and then use this while the Python PEP gets written and adopted.
> 
> What is not clear to me is how one get from the Python callable to the 
> capsule.

This varies substantially based on the tool.   Numba would do it's work and create the capsule object using it's approach.   Cython would use a different approach.   

I would also propose to have in NumPy some basic functions that go back-and forth between this representation, ctypes, and any other useful representations that might emerge.  

> 
> Or do you simply intend to pass a non-callable capsule as an argument in 
> place of the callback?

I had simply intended to allow a non-callable capsule argument to be passed in instead of another call-back to any SciPy or NumPy function that can take a raw C-function pointer.

Thanks,

-Travis




More information about the NumPy-Discussion mailing list