2008-01-19 18:08:21 -04:00
|
|
|
.. highlightlang:: c
|
|
|
|
|
|
|
|
.. _bufferobjects:
|
|
|
|
|
|
|
|
Buffer Objects
|
|
|
|
--------------
|
|
|
|
|
|
|
|
.. sectionauthor:: Greg Stein <gstein@lyra.org>
|
|
|
|
|
|
|
|
|
|
|
|
.. index::
|
|
|
|
object: buffer
|
|
|
|
single: buffer interface
|
|
|
|
|
|
|
|
Python objects implemented in C can export a group of functions called the
|
|
|
|
"buffer interface." These functions can be used by an object to expose its data
|
|
|
|
in a raw, byte-oriented format. Clients of the object can use the buffer
|
|
|
|
interface to access the object data directly, without needing to copy it first.
|
|
|
|
|
|
|
|
Two examples of objects that support the buffer interface are strings and
|
|
|
|
arrays. The string object exposes the character contents in the buffer
|
|
|
|
interface's byte-oriented form. An array can also expose its contents, but it
|
|
|
|
should be noted that array elements may be multi-byte values.
|
|
|
|
|
|
|
|
An example user of the buffer interface is the file object's :meth:`write`
|
|
|
|
method. Any object that can export a series of bytes through the buffer
|
|
|
|
interface can be written to a file. There are a number of format codes to
|
|
|
|
:cfunc:`PyArg_ParseTuple` that operate against an object's buffer interface,
|
|
|
|
returning data from the target object.
|
|
|
|
|
|
|
|
.. index:: single: PyBufferProcs
|
|
|
|
|
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68133 | antoine.pitrou | 2009-01-01 16:38:03 +0100 (Thu, 01 Jan 2009) | 1 line
fill in actual issue number in tests
........
r68134 | hirokazu.yamamoto | 2009-01-01 16:45:39 +0100 (Thu, 01 Jan 2009) | 2 lines
Issue #4797: IOError.filename was not set when _fileio.FileIO failed to open
file with `str' filename on Windows.
........
r68141 | benjamin.peterson | 2009-01-01 17:43:12 +0100 (Thu, 01 Jan 2009) | 1 line
fix highlighting
........
r68142 | benjamin.peterson | 2009-01-01 18:29:49 +0100 (Thu, 01 Jan 2009) | 2 lines
welcome to 2009, Python!
........
r68145 | amaury.forgeotdarc | 2009-01-02 01:03:54 +0100 (Fri, 02 Jan 2009) | 5 lines
#4801 _collections module fails to build on cygwin.
_PyObject_GC_TRACK is the macro version of PyObject_GC_Track,
and according to documentation it should not be used for extension modules.
........
r68146 | ronald.oussoren | 2009-01-02 11:44:46 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4472: "configure --enable-shared doesn't work on OSX"
........
r68148 | ronald.oussoren | 2009-01-02 11:48:31 +0100 (Fri, 02 Jan 2009) | 2 lines
Forgot to add a NEWS item in my previous checkin
........
r68149 | ronald.oussoren | 2009-01-02 11:50:48 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4780
........
r68159 | ronald.oussoren | 2009-01-02 15:48:17 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue 1627952
........
r68160 | ronald.oussoren | 2009-01-02 15:52:09 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue r1737832
........
r68161 | ronald.oussoren | 2009-01-02 16:00:05 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 1149804
........
r68162 | ronald.oussoren | 2009-01-02 16:06:00 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 4472 is incompatible with Cygwin, this patch
should fix that.
........
r68166 | benjamin.peterson | 2009-01-02 19:26:23 +0100 (Fri, 02 Jan 2009) | 1 line
document PyMemberDef
........
r68171 | georg.brandl | 2009-01-02 21:25:14 +0100 (Fri, 02 Jan 2009) | 3 lines
#4811: fix markup glitches (mostly remains of the conversion),
found by Gabriel Genellina.
........
r68172 | martin.v.loewis | 2009-01-02 21:32:55 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4075: Use OutputDebugStringW in Py_FatalError.
........
r68173 | martin.v.loewis | 2009-01-02 21:40:14 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4051: Prevent conflict of UNICODE macros in cPickle.
........
r68174 | benjamin.peterson | 2009-01-02 21:47:27 +0100 (Fri, 02 Jan 2009) | 1 line
fix compilation on non-Windows platforms
........
r68179 | raymond.hettinger | 2009-01-02 22:26:45 +0100 (Fri, 02 Jan 2009) | 1 line
Issue #4615. Document how to use itertools for de-duping.
........
r68195 | georg.brandl | 2009-01-03 14:45:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove useless string literal.
........
r68196 | georg.brandl | 2009-01-03 15:29:53 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix indentation.
........
r68210 | georg.brandl | 2009-01-03 20:10:12 +0100 (Sat, 03 Jan 2009) | 2 lines
Set eol-style correctly for mp_distributing.py.
........
r68214 | georg.brandl | 2009-01-03 20:44:48 +0100 (Sat, 03 Jan 2009) | 2 lines
Make indentation consistent.
........
r68215 | georg.brandl | 2009-01-03 21:15:14 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix role name.
........
r68217 | georg.brandl | 2009-01-03 21:30:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Add rstlint, a little tool to find subtle markup problems and inconsistencies in the Doc sources.
........
r68218 | georg.brandl | 2009-01-03 21:38:59 +0100 (Sat, 03 Jan 2009) | 2 lines
Recognize usage of the default role.
........
r68219 | georg.brandl | 2009-01-03 21:47:01 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix uses of the default role.
........
r68220 | georg.brandl | 2009-01-03 21:55:06 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove trailing whitespace.
........
r68221 | georg.brandl | 2009-01-03 22:04:55 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove tabs from the documentation.
........
r68222 | georg.brandl | 2009-01-03 22:11:58 +0100 (Sat, 03 Jan 2009) | 2 lines
Disable the line length checker by default.
........
2009-01-03 17:55:17 -04:00
|
|
|
More information on the buffer interface is provided in the section
|
2008-01-19 18:08:21 -04:00
|
|
|
:ref:`buffer-structs`, under the description for :ctype:`PyBufferProcs`.
|
|
|
|
|
|
|
|
A "buffer object" is defined in the :file:`bufferobject.h` header (included by
|
|
|
|
:file:`Python.h`). These objects look very similar to string objects at the
|
|
|
|
Python programming level: they support slicing, indexing, concatenation, and
|
|
|
|
some other standard string operations. However, their data can come from one of
|
|
|
|
two sources: from a block of memory, or from another object which exports the
|
|
|
|
buffer interface.
|
|
|
|
|
|
|
|
Buffer objects are useful as a way to expose the data from another object's
|
|
|
|
buffer interface to the Python programmer. They can also be used as a zero-copy
|
|
|
|
slicing mechanism. Using their ability to reference a block of memory, it is
|
|
|
|
possible to expose any data to the Python programmer quite easily. The memory
|
|
|
|
could be a large, constant array in a C extension, it could be a raw block of
|
|
|
|
memory for manipulation before passing to an operating system library, or it
|
|
|
|
could be used to pass around structured data in its native, in-memory format.
|
|
|
|
|
|
|
|
|
|
|
|
.. ctype:: PyBufferObject
|
|
|
|
|
|
|
|
This subtype of :ctype:`PyObject` represents a buffer object.
|
|
|
|
|
|
|
|
|
|
|
|
.. cvar:: PyTypeObject PyBuffer_Type
|
|
|
|
|
|
|
|
.. index:: single: BufferType (in module types)
|
|
|
|
|
|
|
|
The instance of :ctype:`PyTypeObject` which represents the Python buffer type;
|
|
|
|
it is the same object as ``buffer`` and ``types.BufferType`` in the Python
|
|
|
|
layer. .
|
|
|
|
|
|
|
|
|
|
|
|
.. cvar:: int Py_END_OF_BUFFER
|
|
|
|
|
|
|
|
This constant may be passed as the *size* parameter to
|
|
|
|
:cfunc:`PyBuffer_FromObject` or :cfunc:`PyBuffer_FromReadWriteObject`. It
|
|
|
|
indicates that the new :ctype:`PyBufferObject` should refer to *base* object
|
|
|
|
from the specified *offset* to the end of its exported buffer. Using this
|
|
|
|
enables the caller to avoid querying the *base* object for its length.
|
|
|
|
|
|
|
|
|
|
|
|
.. cfunction:: int PyBuffer_Check(PyObject *p)
|
|
|
|
|
|
|
|
Return true if the argument has type :cdata:`PyBuffer_Type`.
|
|
|
|
|
|
|
|
|
|
|
|
.. cfunction:: PyObject* PyBuffer_FromObject(PyObject *base, Py_ssize_t offset, Py_ssize_t size)
|
|
|
|
|
|
|
|
Return a new read-only buffer object. This raises :exc:`TypeError` if *base*
|
|
|
|
doesn't support the read-only buffer protocol or doesn't provide exactly one
|
|
|
|
buffer segment, or it raises :exc:`ValueError` if *offset* is less than zero.
|
|
|
|
The buffer will hold a reference to the *base* object, and the buffer's contents
|
|
|
|
will refer to the *base* object's buffer interface, starting as position
|
|
|
|
*offset* and extending for *size* bytes. If *size* is :const:`Py_END_OF_BUFFER`,
|
|
|
|
then the new buffer's contents extend to the length of the *base* object's
|
|
|
|
exported buffer data.
|
|
|
|
|
|
|
|
|
|
|
|
.. cfunction:: PyObject* PyBuffer_FromReadWriteObject(PyObject *base, Py_ssize_t offset, Py_ssize_t size)
|
|
|
|
|
|
|
|
Return a new writable buffer object. Parameters and exceptions are similar to
|
|
|
|
those for :cfunc:`PyBuffer_FromObject`. If the *base* object does not export
|
|
|
|
the writeable buffer protocol, then :exc:`TypeError` is raised.
|
|
|
|
|
|
|
|
|
|
|
|
.. cfunction:: PyObject* PyBuffer_FromMemory(void *ptr, Py_ssize_t size)
|
|
|
|
|
|
|
|
Return a new read-only buffer object that reads from a specified location in
|
|
|
|
memory, with a specified size. The caller is responsible for ensuring that the
|
|
|
|
memory buffer, passed in as *ptr*, is not deallocated while the returned buffer
|
|
|
|
object exists. Raises :exc:`ValueError` if *size* is less than zero. Note that
|
|
|
|
:const:`Py_END_OF_BUFFER` may *not* be passed for the *size* parameter;
|
|
|
|
:exc:`ValueError` will be raised in that case.
|
|
|
|
|
|
|
|
|
|
|
|
.. cfunction:: PyObject* PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t size)
|
|
|
|
|
|
|
|
Similar to :cfunc:`PyBuffer_FromMemory`, but the returned buffer is writable.
|
|
|
|
|
|
|
|
|
|
|
|
.. cfunction:: PyObject* PyBuffer_New(Py_ssize_t size)
|
|
|
|
|
|
|
|
Return a new writable buffer object that maintains its own memory buffer of
|
|
|
|
*size* bytes. :exc:`ValueError` is returned if *size* is not zero or positive.
|
|
|
|
Note that the memory buffer (as returned by :cfunc:`PyObject_AsWriteBuffer`) is
|
|
|
|
not specifically aligned.
|