Martin Panter added the comment:
According to <https://bugs.python.org/issue20423#msg209581> Serhiy and Antoine
both seem to agree this behaviour is a bug. The reason why newline="\r\n" and
newline="\r" cause these funny translations is that __init__() internally
passes the initial buffer value through write(). So I propose to set the buffer
directly without using write().
However, doing this would have another effect. In the C implementation, write()
also does universal newline decoding. The Python implementation had similar
decoding added in getvalue() to compensate (Issue 20435). I propose to revert
the getvalue() decoding, and to move the universal decoding from write() to
read() in the C implementation.
I anticipate the combined effect of these changes would be:
1. StringIO("\n", newline="\r\n") no longer encodes the newline to CRLF in the
internal buffer, so reading or getvalue() will return "\n" unencoded
2. StringIO("\r\n", newline=None).getvalue() returns "\r\n" undecoded, rather
than universal decoding changing it to "\n"
3. s = StringIO(newline=None); s.write("\r\n"); s.getvalue() also returns
"\r\n" undecoded. It is undocumented, but StringIO intentionally does not
encode to os.linesep (yet another bug IMO).
4. StringIO.newlines would only get updated during reading, rather than during
construction and writing, since newline decoding will only take place during
reading.
There is another bug where the universal newline decoding does not anticipate
split CRLF sequences. This would hopefully be fixed at the same time.
>>> s = io.StringIO(newline=None)
>>> s.write("\r\n" "\r")
3
>>> s.write("\n") # Complete second CRLF
1
>>> s.getvalue() # Should be "\r\n\r\n", at least when os.linesep == "\n"
'\n\n\n'
----------
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue22413>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com