Nikolaus Rath added the comment:
Thanks for taking the time, and apologies about the test failure. I was
probably too eager and ran only the test_io suite instead of everything.
I looked at the failure, and the problem is that the default Python
BufferedIOBase.readinto implementation is semi-broken. It should work with any
object implementing the memoryview protocol (like the C implementation), but it
really only works with bytearray objects. The testIteration test only worked
(prior to the patch) because there is a special case for array objects with
format 'b':
try:
b[:n] = data
except TypeError as err:
import array
if not isinstance(b, array.array):
raise err
b[:n] = array.array('b', data)
In other words, trying to read into any other object has always failed. In
particular, even format code 'B' fails:
>>> import _pyio
>>> from array import array
>>> buf = array('b', b'x' * 10)
>>> _pyio.open('/dev/zero', 'rb').readinto(buf)
10
>>> buf = array('B', b'x' * 10)
>>> _pyio.open('/dev/zero', 'rb').readinto(buf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/nikratio/clones/cpython/Lib/_pyio.py", line 1096, in readinto
buf[:len_] = array.array('b', buf2)
TypeError: bad argument type for built-in operation
The readline implementation that my patch adds for BufferedReader does not
contain this special case, and therefore with the patch even the test with a
'b'-array fails.
For now, I've added the same special casing of 'b'-type arrays to the
_readline() implementation in BufferedReader. This fixes the immediate problem
(and this time I definitely ran the entire testsuite).
However, the fix is certainly not what I would consider a good solution.. but I
guess that would better be addressed by a separate patch that also fixes the
same issue in BufferedIOBase?
----------
Added file: http://bugs.python.org/file35539/issue20578_r4.diff
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue20578>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com