Stefan Krah added the comment:

Yes, PyBuffer_FillInfo() is a bit confusing:  The canonical usage *looks* as
if "flags" were somehow used in the Py_buffer struct to mark a buffer as having
certain capabilities:

Modules/_io/bufferedio.c:
-------------------------

    if (PyBuffer_FillInfo(&buf, NULL, start, len, 0, PyBUF_CONTIG) == -1)
        return -1;
    memobj = PyMemoryView_FromBuffer(&buf);

What really goes on since Python 3.3 is that memobj is a memoryview
with (shape,strides,format), since missing Py_buffer values are
reconstructed.

So all memoryviews -- when acting as an exporter as in this example --
have PyBUF_FULL capabilities.  To make that clear, we should actually
change the PyBUF_CONTIG in the above example to PyBUF_FULL.  Then
the mental model is:

    PyBuffer_FillInfo(..., PyBUF_FULL)

                 ^
                 |  "Request" full buffer to export.

               memobj

                 ^
                 |  Request anything from PyBUF_SIMPLE to PyBUF_FULL. Note
                 |  that e.g. with PyBUF_SIMPLE the consumer's shape and
                 |  strides will be NULL!

              Consumer

And that model is consistent with the usage of PyBuffer_FillInfo() inside
a getbufferproc, where "flags" of course can be anything.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue21778>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to