[Python-Dev] PEP 215 and EvalDict, yet another alternative

Barry A. Warsaw barry@zope.com
Tue, 15 Jan 2002 02:26:19 -0500


>>>>> "SM" == Steven Majewski <sdm7g@Virginia.EDU> writes:

    SM> Since PEP 216 on string interpolation is still active, I'ld
    SM> appreciate it if some of it's supporters would comment on my
    SM> revised alternative solution (posted on comp.lang.python and
    SM> at google thru):

[Steve's EvalDict]

For completeness, here's a simplified version of Mailman's _()
function which does auto-interpolation from locals and globals of the
calling context.  This version works in Python 2.1 or beyond and has
the i18n translation stuff stripped out.  For the full deal, see

    http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/mailman/mailman/Mailman/i18n.py?rev=2.4&content-type=text/plain

Cheers,
-Barry

-------------------- snip snip --------------------dollar.py
import sys
from UserDict import UserDict
from types import StringType

class SafeDict(UserDict):
    """Dictionary which returns a default value for unknown keys."""
    def __getitem__(self, key):
        try:
            return self.data[key]
        except KeyError:
            if isinstance(key, StringType):
                return '%('+key+')s'
            else:
                return '<Missing key: %s>' % `key`

def _(s):
    frame = sys._getframe(1)
    d = SafeDict(frame.f_globals.copy())
    d.update(frame.f_locals)
    return s % d


BIRD = 'parrot'

def examples(thing):
    bird = 'dead ' + BIRD
    print _('It used to be a %(BIRD)s')
    print _('But now it is a %(bird)s')
    print _('%(BIRD)s or %(bird)s?')
    print _('You are not %(morg)s, you are not %(imorg)s')
    print _('%(thing)s, %(thing)s, what is %(thing)s?')

examples(sys.argv[1])
-------------------- snip snip --------------------

% python /tmp/dollar.py brain
It used to be a parrot
But now it is a dead parrot
parrot or dead parrot?
You are not %(morg)s, you are not %(imorg)s
brain, brain, what is brain?