[Python-Dev] Draft PEP: Deprecate codecs.StreamReader and codecs.StreamWriter (original) (raw)
Victor Stinner victor.stinner at haypocalc.com
Thu Jul 7 12:22:51 CEST 2011
- Previous message: [Python-Dev] Draft PEP: Deprecate codecs.StreamReader and codecs.StreamWriter
- Next message: [Python-Dev] Draft PEP: Deprecate codecs.StreamReader and codecs.StreamWriter
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Le 07/07/2011 03:16, Benjamin Peterson a écrit :
2011/7/6 Victor Stinner<victor.stinner at haypocalc.com>:
codecs.open() will be changed to reuse the builtin open() function (TextIOWrapper). This doesn't strike me as particularly backwards compatible, since you've just enumerated the differences between StreamWriter/Reader and TextIOWrapper. Which kind of differences are you thinking about? I only listed two attributes specific to StreamReaderWriter (.reader and .writer). You mean that these attributes are used? There are maybe other subtle differences between Stream* and TextIOWrapper, but I don't think that anyone relies on them. Should I try to list all differences in the PEP?
If I understood correctly the previous discussion, an important point is to be able to write code Python 2 which "just works" on Python 3 without using 2to3. If you don't rely on the subtle implementation details of Stream*, it's possible (to use codecs.open in Python 3, even if codecs.open is implemented to reuse TextIOWrapper via open). If you rely on the differences, I bet that it is easy to not use these differences (and continue to be compatible with Python 2). For example, you can replace f.reader.read() by f.read(), it's just the same.
The two classical usages of codecs.open() (of text files) are:
- read the whole file content
- read the file line by line
For this two usecases, the API is exactly the same. Using f=codecs.open() or f=open() (in Python 3, or f=io.open() in Python 2), you can use:
- for line in f: ...
- while True: line = f.readline(); if not line: break; ...
- f.read()
I'm not saying that my PEP doesn't break the compatibility, it does break the backward compatibility. That's why we need a PEP. That's why there is a section called "Backwards Compatibility" in the PEP. I'm trying to say that I bet that nobody will notice.
The most impacting change will be (at the end) the removal of the StreamReader/StreamWriter API. If a program uses directly these classes, it will have to be updated to use TextIOWrapper (or codecs.open() or open() maybe).
I wrote in a previous email:
"I did search for usage of these classes on the Internet, and except projects implementing their own codecs (and so implement their StreamReader/StreamWriter classes, even if they don't use it), I only found one project using directly StreamReader: pygment (*). I searched quickly, so don't trust these results :-) StreamReader & friends are used indirectly through codecs.open(). My patch changes codecs.open() to make it reuse open (io.TextIOWrapper), so the deprecation of StreamReader would not be noticed by most users.
(*) I also found Sphinx, but I was wrong: it doesn't use StreamReader, it just has a full copy of the UTF-8-SIG codec which has a StreamReader class. I don't think that the class is used."
Victor
- Previous message: [Python-Dev] Draft PEP: Deprecate codecs.StreamReader and codecs.StreamWriter
- Next message: [Python-Dev] Draft PEP: Deprecate codecs.StreamReader and codecs.StreamWriter
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]