[Python-Dev] Fw: Behavior of buffer()

Mark Hammond mhammond@skippinet.com.au
Sun, 14 Jul 2002 12:49:18 +1000


> It seems we're still in the same boat.  It would be saner to change
> buffer slices to return buffer objects, except for backward
> compatibility.  I was hoping to hear from someone who uses buffer
> objects and knows that this would break his code.  Scott apparently
> doesn't have this problem with his own code, so his opinion doesn't
> help. :-(

There may be some breakage in the Win32 overlapped IO world.  A common
pattern is:

  buf = allocate_buffer_somehow(size)
  Perform_Async_Read(size)
  #  wait for notification of read completing
  nbytes = Wait_For_Read_Notification()
  data = buf[:nbytes]

Currently, "data" is a string.  Changing this to a buffer object will
presumably break this code once "data" is passed to some other function that
truly requires a string.

> Maybe the name 'buffer' suggests false expectations?  It's not a
> buffer, it's an alias for a memory area.

This distinction is a little gray.  In my example, it is truly a buffer -
but also an alias for a memory area.  In my example though, it is *not*
conceptually an alias for memory owned by another object.

> Maybe we should do something stronger, and deprecate the buffer type
> altogether.

Maybe.  However, as you have seen over the years, *something* from all this
mess is a real requirement.  This example of asynch IO is the only example I
have ever used, but IMO, it is a real and reasonable requirement.  My
example *could* have been done with array() (assuming the array module had a
C API exposed which it doesn't/didn't) but that too looks like a square peg
in a round hole - my requirements call for a pre-allocated byte buffer, not
an array.

All that said: if the worst came to the worst, I could ensure that the Win32
extensions are left compatible with the way they are.  All such buffers are
allocated using a function inside one of my modules.  Currently this just
returns a buffer() object, but could be changed to a private object with the
same semantics as the existing buffer() object.  So consider this more a
data point than an attempted veto.

Mark.