[Python-Dev] Replacement for print in Python 3.0

Nick Coghlan ncoghlan at gmail.com
Wed Sep 7 15:07:54 CEST 2005


Nick Coghlan wrote:
> I found the following to be an interesting experiment:
> 
> -------------
> from string import Template
> 
> def format(*args, **kwds):
>         fmt = args[0]
>         kwds.update(("p%s" % idx, arg) for idx, arg in enumerate(args))
>         return Template(fmt).substitute(**kwds)

I forgot to add the following concept:

-------------
def printf(*args, **kwds):
     to = kwds.pop("to", sys.stdout)
     to.write(format(*args, **kwds))

Py> printf("$p1: $p2\n", 1, 2)
1: 2
Py> printf("$p1: $p2\n", 1, 2, to=sys.stderr)
1: 2
Py> printf("$p1: $p2$to\n", 1, 2, to=sys.stderr)
Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "<stdin>", line 3, in printf
   File "<stdin>", line 4, in format
   File "C:\Python24\lib\string.py", line 172, in substitute
     return self.pattern.sub(convert, self.template)
   File "C:\Python24\lib\string.py", line 162, in convert
     val = mapping[named]
KeyError: 'to'

-------------

If you're dealing with an existing template that uses the 'to' keyword, then 
it is possible to fall back to using:

-------------
def printraw(*args, **kwds):
     to = kwds.pop("to", sys.stdout)
     for arg in args:
         to.write(arg)

Py> printraw(format("$p1: $p2$to\n", 1, 2, to="There"), to=sys.stderr)
1: 2There
-------------

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://boredomandlaziness.blogspot.com


More information about the Python-Dev mailing list