Hello,

during my work on PEP-3118 fixes I noticed that memoryview does not handle
the "B" format specifier according to the struct module documentation:


Here's what struct does:

>>> b = bytearray([1,2,3])
>>> struct.pack_into('B', b, 0, b'X')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: required argument is not an integer
>>> struct.pack_into('c', b, 0, b'X')
>>> b
bytearray(b'X\x02\x03')


Here's what memoryview does:

>>> b = bytearray([1,2,3])
>>> m = memoryview(b)
>>> m.format
'B'
>>> m[0] = b'X'
>>> m[0] = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' does not support the buffer interface


So, memoryview does exactly the opposite of what is specified. It should
reject the bytes object but accept the integer.


I would like to fix this in the features/pep-3118 repository as follows:

  - memoryview should respect the format specifiers.

  - bytearray and friends should set the format specifier to "c"
    in their getbuffer() methods.

  - Introduce a new function PyMemoryView_FromBytes() that can be used
    instead of PyMemoryView_FromBuffer(). PyMemoryView_FromBuffer()
    is usually used in conjunction with PyBuffer_FillInfo(), which
    sets the format specifier to "B".


Are there any general objections to this?


Stefan Krah


_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to