Quick and dirty answer.
I have ~10 years experience with Python and it seems
to me the io module is technically excellent.
However, I have found it is not so obvious to
understand the usage of all these arguments,
errors, encoding, line_buffering, ... in the
class constructors and methods like io.open().
The doc describes what these arguments are,
their states, but not too much how to use
them.
As an exemple, I read some time ago on the c.l.p
mailing list, somebody complaining about the "encoding"
argument of the class TextIOWrapper. He defined an
"encoding='utf-8'" in the ctor and did not
understand why his "text" was not automagically
encoded. Answer: the encoding arg is only a kind
of information and does not do anything.
BTW, it was only when I read that post, I understand
a little bit more.
Regards.