[Python-3000] PEP Draft: Enhancing the buffer protcol

Travis E. Oliphant oliphant.travis at ieee.org
Wed Feb 28 05:53:42 CET 2007


Greg Ewing wrote:
> Travis E. Oliphant wrote:
> 
>>     typedef char *(*formatbufferproc)(PyObject *view, int *itemsize)
>>
>>       Get the format-string of the memory using the struct-module
>>       string syntax
> 
> I'm not sure whether a struct-format string would be
> the most convenient form for use by C-level code, as
> it could require some tedious parsing to extract
> useful information from it.

Yes, this was the reason for my dtype object.  But, I think that folks 
felt it was too much, especially since the struct-style syntax is 
already there in Python.

Do you have any other suggestions?

> 
>>     typedef PyObject *(*shapebufferproc)(PyObject *view)
>>
>>       Return a 2-tuple of lists containing shape information: (shape,
>>       strides).
> 
> I'm also not sure about using Python data structures
> to represent this, as it will force C-level code to
> use Python API calls to pull it apart. What would be
> wrong with C array of structs containing two integers
> each?

Nothing except memory management.  Now, you have to worry about 
allocating and deallocating memory.

> 
> The buffer API is for the use of C code, and it should
> be designed with the convenience of C code in mind.

I agree.  I would like to use something besides Python objects, but 
handling the memory allocation is non-trivial.

On the other hand, Python tuples are pretty simple wrappers around 
integers.

> Using Python data structures unnecessarily seems like
> the wrong way to go about that.
> 
> The following alternative would seem to provide most of
> the things that Travis's proposal does without involving
> Python objects:
> 
>      struct pybuffer_shape {
>         Py_ssize_t length;
>         Py_ssize_t stride;
>      };
> 
>      typedef int (*getbufferproc)(PyObject *obj,
>         void **buf, Py_ssize_t *len,
>         char **format,
>         struct pybuffer_shape **shape, int *ndim);
> 
>         /* Any of buf, format and shape may be NULL if you're
>            not interested in them. */
>

Besides not allowing for the request of a "contiguous" buffer from the 
object or a writeable one you are also not describing how allocation for 
this array of structs will be handled.

I'm not opposed in principle.  In fact, I would like to get rid of the 
Python objects in the protocol (in the array_struct interface for NumPy 
we have the shape and strides in an array of integers).

The memory management is the only issue.

-Travis



More information about the Python-3000 mailing list