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

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 testuu 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