[Python-checkins] r56891 - peps/trunk/pep-3118.txt
travis.oliphant
python-checkins at python.org
Fri Aug 10 09:54:26 CEST 2007
Author: travis.oliphant
Date: Fri Aug 10 09:54:25 2007
New Revision: 56891
Modified:
peps/trunk/pep-3118.txt
Log:
Changes to MemoryViewObject portion of PEP 3118 to reflect code.
Modified: peps/trunk/pep-3118.txt
==============================================================================
--- peps/trunk/pep-3118.txt (original)
+++ peps/trunk/pep-3118.txt Fri Aug 10 09:54:25 2007
@@ -156,7 +156,7 @@
argument is the address to a bufferinfo structure. If view is ``NULL``,
then no information is returned but a lock on the memory is still
obtained. In this case, the corresponding releasebuffer should also
-be called with ``NULL``.
+be called with ``NULL``.
The third argument indicates what kind of buffer the consumer is
prepared to deal with and therefore what kind of buffer the exporter
@@ -490,46 +490,42 @@
typedef struct {
PyObject_HEAD
PyObject *base;
- int ndims;
- Py_ssize_t *starts; /* slice starts */
- Py_ssize_t *stops; /* slice stops */
- Py_ssize_t *steps; /* slice steps */
+ PyBuffer view;
} PyMemoryViewObject;
-This is functionally similar to the current buffer object except only
-a reference to base is kept. The actual memory for base must be
-re-grabbed using the buffer-protocol, whenever it is actually
-needed (after which it is immediately released).
-
-The getbuffer and releasebuffer for this object use the underlying
-base object (adjusted as needed using the slice information). If the
-number of dimensions of the base object (or the strides or the size)
-has changed when a new view is requested, then the getbuffer will
-trigger an error. Methods on the MemoryView object will allow
-manual locking and unlocking of the underlying buffer.
+This is functionally similar to the current buffer object except a
+reference to base is kept and the memory view is not re-grabbed.
+Thus, this memory view object holds on to the memory of base until it
+is deleted.
+
+The getbuffer and releasebuffer for this object increments and
+decrements the lock on base, but passes on the contents of view to the
+caller.
-This memory-view object will support mult-dimensional slicing and be
+This memory-view object will support multi-dimensional slicing and be
the first object provided with Python to do so. Slices of the
-memory-view object are other memory-view objects. When an "element"
-from the memory-view is returned it is always a bytes object whose
-format should be interpreted by the format attribute of the memoryview
-object. The struct module can be used to "decode" the bytes in Python
-if desired.
+memory-view object are other memory-view objects with the same base
+but with a different view of the base object.
+
+When an "element" from the memory-view is returned it is always a
+bytes object whose format should be interpreted by the format
+attribute of the memoryview object. The struct module can be used to
+"decode" the bytes in Python if desired. Or the contents can be
+passed to a NumPy array or other object consuming the buffer protocol.
The Python name will be
-``__builtin__.memory``
+``__builtin__.memoryview``
Methods:
-| ``lock``
-| ``unlock``
| ``__getitem__`` (will support multi-dimensional slicing)
| ``__setitem__`` (will support multi-dimensional slicing)
-| ``tobytes`` (obtain a bytes-object of everything in the memory).
+| ``tobytes`` (obtain a new bytes-object of a copy of the memory).
| ``tolist`` (obtain a "nested" list of the memory. Everything
is interpreted into standard Python objects
- as the struct module unpack would do).
+ as the struct module unpack would do -- in fact
+ it uses struct.unpack to accomplish it).
Attributes (taken from the memory of the base object):
@@ -552,25 +548,36 @@
::
- int PyObject_GetContiguous(PyObject *obj, void **buf, Py_ssize_t *len,
- char **format, int writeable, char fortran)
-
-Return a contiguous chunk of memory representing the buffer. If a
-copy is made then return 1. If no copy was needed return 0. If an
-error occurred in probing the buffer interface, then return -1. The
-contiguous chunk of memory is pointed to by ``*buf`` and the length of
-that memory is ``*len``. If writeable is 1, then the returned memory
-must be writeable or else an error is raised. Otherwise, the memory
-may or may not be writeable. If the object is multi-dimensional, then
-if fortran is 'F', the first dimension of the underlying array will
-vary the fastest in the buffer. If fortran is 'C', then the last
-dimension will vary the fastest (C-style contiguous). If fortran is
-'A', then it does not matter and you will get whatever the object
-decides is more efficient. If a copy is made, then the memory must be
-freed by calling ``PyMem_Free``.
+ PyObject * PyMemoryView_GetContiguous(PyObject *obj, int buffertype,
+ char fort)
-PyObject_ReleaseBuffer must be called on obj after you are done with the
-memory even if a copy is made.
+Return a memoryview object to a contiguous chunk of memory represented
+by obj. If a copy must be made (because the memory pointed to by obj
+is not contiguous), then a new bytes object will be created and become
+the base object for the returned memory view object.
+
+The buffertype argument can be PyBUF_READ, PyBUF_WRITE,
+PyBUF_UPDATEIFCOPY to determine whether the returned buffer should be
+READONLY, WRITEABLE, or set to update the original buffer if a copy
+must be made. If buffertype is PyBUF_WRITE and the buffer is not
+contiguous an error will be raised. In this circumstance, the user
+can use PyBUF_UPDATEIFCOPY to ensure that a a writeable temporary
+contiguous buffer is returned. The contents of this contiguous buffer
+will be copied back into the original object after the memoryview
+object is deleted as long as the original object is writeable and
+allows setting its memory to "readonly". If this is not allowed by
+the original object, then a BufferError is raised.
+
+If the object is multi-dimensional, then if fortran is 'F', the first
+dimension of the underlying array will vary the fastest in the buffer.
+If fortran is 'C', then the last dimension will vary the fastest
+(C-style contiguous). If fortran is 'A', then it does not matter and
+you will get whatever the object decides is more efficient. If a copy
+is made, then the memory must be freed by calling ``PyMem_Free``.
+
+You receive a new reference to the memoryview object which will also
+hold a lock on the objects data area (this lock will be released when
+the memoryview object is deleted).
::
More information about the Python-checkins
mailing list