[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