[Python-3000] TextIOWrapper.write(s:str) and bytes in py3k-struni

Guido van Rossum guido at python.org
Mon Jul 16 23:23:33 CEST 2007


On 7/14/07, Christian Heimes <lists at cheimes.de> wrote:
> I'm having some troubles with unit tests in the py3k-struni branch. Some
> test like test_uu are failing because an io.TextIOWrapper instance's
> write() method doesn't handle bytes. The method is defined as:
>
>     def write(self, s: str):
>         if self.closed:
>             raise ValueError("write to closed file")
>         # XXX What if we were just reading?
>         b = s.encode(self._encoding)
>         if isinstance(b, str):
>             b = bytes(b)
>         n = self.buffer.write(b)
>         if "\n" in s:
>             # XXX only if isatty
>             self.flush()
>         self._snapshot = self._decoder = None
>         return len(s)
>
> The problematic lines are the lines from s.encode() to b = bytes(b). The
> behavior is more than questionable. A bytes object doesn't have an
> encode() method and str's encode method() always returns bytes. IMO the
> write() method should be changed to:
>
>     def write(self, s: (str, bytes)):
>         if self.closed:
>             raise ValueError("write to closed file")
>         # XXX What if we were just reading?
>         if isinstance(s, basestring):
>             b = s.encode(self._encoding)
>         elif isinstance(s, bytes):
>             b = s
>         else:
>             b = bytes(b)
>         n = self.buffer.write(b)
>         if b"\n" in b:
>             # XXX only if isatty
>             self.flush()
>         self._snapshot = self._decoder = None
>         return len(s)
>
> Or the write() should explictly raise a TypeError when it is not allowed
> to handle bytes.

I came across this in your SF patch. I disagree with your desire to
let TextIOWrapper.write() handle bytes: it should *only* be passed str
objects. The uu test was failing because it was writing bytes to a
text stream.

Perhaps the error should be better; though I'm not sure I want to add
explicit type checks (as it would defeat duck typing).

-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-3000 mailing list