This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author martin.panter
Recipients Henning.von.Bargen, benjamin.peterson, docs@python, martin.panter, pitrou, r.david.murray, serhiy.storchaka
Date 2016-05-28.00:34:28
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1464395675.73.0.13462442272.issue20699@psf.upfronthosting.co.za>
In-reply-to
Content
Porting this to Python 2 uncovered a few flaws that I am unsure how to best handle. In this patch I have added workarounds, but perhaps we can find better fixes.

1. The io.BytesIO.write() C implementation does not accept array.array() objects. I suspect it only accepts objects implementing the “new” memoryview() buffer protocol, and array() only implements the “old” buffer() protocol.

In Python 2, is array.array() considered a bytes-like object? If so, the proposed update to the write() documentation is not consistent. Perhaps it is a real bug to fix in the BytesIO implementation. Or is test_array_writes() just going too far for Python 2?

I added code to skip the relevant test in test_array_writes(). Maybe it would be simplest to document that in general, BufferedIOBase.write() only has to accept “new” memoryview()-able objects.

2. The _pyio.BufferedIOBase.readinto() native Python implementation cannot assign into arbitrary bytes-like objects. Python 2 does not have memoryview.cast("B"), buffer() objects seem to be read-only, and I can’t think of any other easy way.

I reverted back to only testing native Python readinto() methods with bytearray(). But perhaps it would be best to document that for Python 2, only memoryview()-able arrays of bytes are acceptable, which should be practical to  handle in native Python code.

3. The _pyio.BytesIO.write() and BufferedWriter.write() native Python implementations did not handle obscure bytes-like objects well. I added buffer() calls to the code. But I am not sure this is a good idea, because it will raise warnings with “python -3”. An alternative might be to again only require write() to accept memoryview()-able arrays of bytes.

Perhaps the Python 2 definition of “bytes-like object” should be restricted to the “new” memoryview() buffer protocol, and to 1-D arrays of bytes. I.e. memoryview(byteslike).ndim == 1 and memoryview(byteslike).format == "B".
History
Date User Action Args
2016-05-28 00:34:35martin.pantersetrecipients: + martin.panter, pitrou, benjamin.peterson, r.david.murray, docs@python, serhiy.storchaka, Henning.von.Bargen
2016-05-28 00:34:35martin.pantersetmessageid: <1464395675.73.0.13462442272.issue20699@psf.upfronthosting.co.za>
2016-05-28 00:34:35martin.panterlinkissue20699 messages
2016-05-28 00:34:34martin.pantercreate