Open
Description
Here's converting an array to a memoryview and back (Python 3) where itemsize equals the offsets of the last item plus its size:
>>> d1 = np.dtype({'formats': ['u1'], 'offsets': [0], 'names': ['x']})
>>> a1 = np.empty(0, d1)
>>> memoryview(a1).format
'T{B:x:}'
>>> memoryview(a1).itemsize
1
>>> np.array(memoryview(a1))
array([],
dtype=[('x', 'u1')])
If we try to do the same where itemsize is bigger, it fails:
>>> d2 = np.dtype({'formats': ['u1'], 'offsets': [0], 'names': ['x'], 'itemsize': 4})
>>> d2.descr
[('x', '|u1'), ('', '|V3')] # the trailing padding is there
>>> a2 = np.empty(0, d2)
>>> memoryview(a2).format
'T{B:x:}' # shouldn't this be 'T{B:x:3x}'?
>>> memoryview(a2).itemsize
4
# so far so good...
# however:
>>> np.array(memoryview(a2))
RuntimeWarning: Item size computed from the PEP 3118 buffer format string does not match the actual item size.
NotImplementedError: memoryview: unsupported format T{B:x:}
This seems quite wrong.
Looking at the code where it fails, _dtype_from_pep3118
only accepts a format string and not the itemsize, so the generated format string is probably wrong and should explicitly contain the trailing bytes?
May be somewhat related: #6361