[I18n-sig] Printing objects on files

Ka-Ping Yee ping@lfw.org
Wed, 3 May 2000 02:41:20 -0700 (PDT)


The following is all stolen from E: see http://www.erights.org/.

As i mentioned in the previous message, there are reasons that
we might want to enable files to know what it means to print
things on them.

    print x

would mean

    sys.stdout.printout(x)

where sys.stdout is defined something like

    def __init__(self):
        self.encs = ["ASCII"]

    def pushenc(self, enc):
        self.encs.append(enc)
    
    def popenc(self):
        self.encs.pop()
        if not self.encs: self.encs = ["ASCII"]

    def printout(self, x):
        if type(x) is type(u""):
            self.write(x.encode(self.encs[-1]))
        else:   
            x.__print__(self)
        self.write("\n")

and each object would have a __print__ method; for lists, e.g.:

    def __print__(self, file):
        file.write("[")
        if len(self):
            file.printout(self[0])
        for item in self[1:]:
            file.write(", ")
            file.printout(item)
        file.write("]")

for floats, e.g.:

    def __print__(self, file):
        if hasattr(file, "floatprec"):
            prec = file.floatprec
        else:
            prec = 17
        file.write("%%.%df" % prec % self)

The passing of control between the file and the objects to
be printed enables us to make Tim happy:

    >>> l = [1/2, 1/3, 1/4]            # I can dream, can't i?

    >>> print l
    [0.3, 0.33333333333333331, 0.25]

    >>> sys.stdout.floatprec = 6
    >>> print l
    [0.5, 0.333333, 0.25]

Fantasizing about other useful kinds of state beyond "encs"
and "floatprec" ("listmax"? "ratprec"?) and managing this
namespace is left as an exercise to the reader.


-- ?!ng