Part of my buffer proposal is to provide our own implementation of it
for Python 2 (I'm unsure about the status for 2.6, it seems like not the
whole buffer API might be backported). For now I'll just do whatever
will get us something to play with, but what do people think is a
long-term solution for this?
What is needed is that for Python 2 is that we bundle something like
this (psuedo-code):
#ifdef Py2
PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view,
int flags) {
if (numpy is available && obj instanceof numpy.ndarray) {
view->buf = obj->data;
view->strides = obj->strides;
view->shape = obj->shape;
...
} else if (PIL is available && obj instanceof Imaging.Image) {
...
} ... other buffers ...
}
#endif
Now the question is, how do I best do this? The "X is available" (and if
so, #include its headers...) is the tricky part. I'm thinking along the
lines of having a new special attribute on the classes in question,
something like this:
cdef extern from "cythonbufferbackwardscompat.h":
cdef int NumPyGetBuffer(PyObject*, Py_buffer*, int)
cdef int NumPyReleaseBuffer(PyObject*, Py_buffer*)
cdef class numpy.ndarray ... :
__cython_py2_getbuffer__ = "NumPyGetBuffer"
__cython_py2_releasebuffer__ = "NumPyReleaseBuffer"
And then generate a pyx-file-specific local PyObject_GetBuffer depending
on the __cython_py2_buffer__ we can find:
#ifdef Py2
static int PyObject_GetBuffer(PyObject *, Py_buffer *, int);
#endif
... code using PyObject_GetBuffer ...
#ifdef Py2
PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view,
int flags) {
if (obj is numpy.ndarray) {
return NumPyGetBuffer(obj, view, flags);
} else if ...
} else { raise not supported-exception }
}
#endif
Thoughts? A disadvantage is that "cythonbufferbackwardscompat.h": (and
.c?) must be provided, but inlineable-code-in-pxds can help with that on
a later date (Robert: This is something I'll push past midterm-eval if
needed; if so I'll just make it work by hard-coding NumPy-specific stuff
directly).
--
Dag Sverre
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev