Le 07/07/2011 03:16, Benjamin Peterson a écrit :
2011/7/6 Victor Stinner<victor.stin...@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
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to