[Python-Dev] PEP 296 - The Buffer Problem

Thomas Heller thomas.heller@ion-tof.com
Thu, 25 Jul 2002 21:47:56 +0200


From: "Scott Gilbert" <xscottg@yahoo.com>
> --- Thomas Heller <thomas.heller@ion-tof.com> wrote:
> > What if we would 'fix' the buffer interface?
> > 
> 
> This gets us part of the way there, but still has shortcomings.  For one I,
> and people more significant than me, would still need a type that
> implemented the bytes object behavior.

Sure, the extension of the buffer interface is only part of the
picture. The bytes type is still needed as well.

The extension I proposed is motivated by these thoughts:

It would enable some of Python's builtin objects to
expose the interface extension by supplying two
trivial functions for each in the extended tp_as_buffer slot.

The new functions expose a 'safe buffer interface', where
there are guarantees about the lifetime of the pointer. So
your bytes object can be a view of these builtin objects
as well.

It dismisses the segment count of the normal buffer interface.

>   Everything but efficient pickling
> _could_ be done with third party extensions, but ignoring pickling (which I
> don't want to do), then we'd still have several significant third parties
> reinventing the same wheel.  To me at least, this feels like a battery that
> should be included.
> 

I don't think my proposal prevents this.

> 
> > Extend the PyBufferProcs structure by new fields:
> > 
> >     typedef size_t (*getlargereadbufferproc)(PyObject *, void **);
> >     typedef size_t (*getlargewritebufferproc)(PyObject *, void **);
> > 
> 
> How would you designate failure/exceptions?  size_t is unsigned everywhere
> I can find it, so it can't return a negative number on failure.  I guess
> the void** could be filled in with NULL.
> 

Details, not yet fleshed out completely. Store NULL in the void **,
use ptrdiff_t instead of size_t, or something else. Or return
((size_t)-1) on failure. Or return -1 on failure, and fill out
an size_t pointer:
  typedef int (*getlargereadwritebufferproc(PyObject *, size_t *, void **);


> > Python strings, unicode strings, mmap objects, and maybe other types
> > would expose the large buffer interface, but the array type would
> > *not*. We could also change the name from 'large buffer interface'
> > to something more sensible, currently I don't have a better name.

Maybe it should be renamed 'safe buffer interface extension' instead
of 'large buffer interface' (it could be large as well)?

> 
> I've been trying to keep the proposal as unintrusive as possible while
> still implementing the functionality needed.  Adding more flags/members to
> PyObjects and modifying string, unicode, mmap, ... feels like a more
> intrusive change to me.  I'm open to the idea, but I'm not ready to retract
> the current proposal.  Then there is still the problem of needing something
> like a bytes object as mentioned above.

The advantage (IMO) is that it defines a new protocol to get the
pointer to the internal byte array on objects instead of
requiring that these objects are instances of a special type
or subtype thereof.

> 
> __________________________________________________
> Do You Yahoo!?

No, I google. ;-)

Thomas