[I18n-sig] Re: Printing objects on files

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


On Wed, 3 May 2000, Ka-Ping Yee wrote:
> 
> 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.

Okay, i lied.  Shortly after writing this i realized that it
is probably advisable for all such bits of state to be stored
in stacks, so an interface such as this might do:

    def push(self, key, value):
        if not self.state.has_key(key):
            self.state[key] = []
        self.state[key].append(value)

    def pop(self, key):
        if self.state.has_key(key):
            if len(self.state[key]):
                self.state[key].pop()

    def get(self, key):
        if not self.state.has_key(key):
            stack = self.state[key][-1]
        if stack:
            return stack[-1]
        return None

Thus:

    >>> print 1/3
    0.33333333333333331

    >>> sys.stdout.push("float.prec", 6)
    >>> print 1/3
    0.333333

    >>> sys.stdout.pop("float.prec")
    >>> print 1/3
    0.33333333333333331

And once we allow arbitrary strings as keys to the bits
of state, the period is a natural separator we can use
for managing the namespace.

Take the special case for Unicode out of the file object:
    
    def printout(self, x):
        x.__print__(self)
        self.write("\n")

and have the Unicode string do the work:

    def __printon__(self, file):
        file.write(self.encode(file.get("unicode.enc")))

This behaves just right if an encoding of None means ASCII.

If mucking with encodings is sufficiently common, you could
imagine conveniences on file objects such as

    def __init__(self, filename, mode, encoding=None):
        ...
        if encoding:
            self.push("unicode.enc", encoding)

    def pushenc(self, encoding):
        self.push("unicode.enc", encoding)

    def popenc(self, encoding):
        self.pop("unicode.enc")


-- ?!ng