[Python-3000] New io system and binary data (original) (raw)

Christian Heimes lists at cheimes.de
Thu Sep 20 12:12:48 CEST 2007


Greg Ewing wrote:

Christian Heimes wrote:

With Python 2.5 the input and output data isn't implicitly converted Are you sure that's always true? What about systems where newlines aren't \n?

Windows is a strange beast. As far as I can remember the OS converts the incoming and outgoing standard streams to Unix line endings \n. A true binary standard stream on Windows needs some effort - unfortunately. :(

I recommend that the problem and fix gets documented. Maybe stdin, stdout and stderr should get a method that disables the implicit conversion like setMode("b") / setMode("t"). Or maybe another set of objects called stdbin, stdbout, stdberr.

I have given some thoughts to it while I was writing the initial mail. I had the names stdinb, stdoutb and stderrb in mind but your names are better. The problem with the binary stream lies in the fine detail. We can't simply assign sys.stdout.buffer to sys.stdbout. I - as a Python user - would expect that stdbout will always use the same backend as stdout:

Python sets

sys.stdbout = sys.stdout.buffer

Now the user assigns a new file to stdout

sys.stdout = file("myoutput", "w")

and blindly expects that

sys.stdbout.write("data\ndata\n") does the right thing.

A proxy like following (untested) class might do the trick.

import sys class StdBinaryFacade: def init(self, name): self._name = name

def __getattr__(self, key):
    buffer = getattr(sys, self._name).buffer
    return getattr(buffer, key)

def __repr__(self):
    return "<%s for sys.%s at %i>" % (self.__name__, self._name,

id(self))

sys.stdbout = StdBinaryFacade("stdout")

Christian



More information about the Python-3000 mailing list