Fredrik Lundh wrote:
Jim Hill wrote:


I'm trying to write a script that writes a script for a rather specialized
task.  I know that seems weird, but the original version was written in
Korn shell and most of my team are familiar with the way it does things
even though they don't read Korn.


so why didn't you tell us? ;-)

if you want $-style interpolation, you can use the new string.Template
class (mentioned in passing by Nick above); useful examples here:

    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/304004

if you don't have 2.4, you can use the RE machinery for the same purpose;
see e.g.

http://effbot.org/zone/re-sub.htm#simple-templating

You might also try the following:

---------python--------------
# a self-substituting string object. Just set attribute names to mapping names
# that are given in the initializer string.
class mapstr(str):
def __new__(cls, initstr, **kwargs):
s = str.__new__(cls, initstr)
return s
def __init__(self, initstr, **kwargs):
d = {}
for name in _findkeys(self):
d[name] = kwargs.get(name, None)
self.__dict__["_attribs"] = d
def __setattr__(self, name, val):
if name not in self.__dict__["_attribs"].keys():
raise AttributeError, "invalid attribute name %r" % (name,)
self.__dict__["_attribs"][name] = val
def __getattr__(self, name):
try:
return self.__dict__["_attribs"][name]
except KeyError:
raise AttributeError, "Invalid attribute %r" % (name,)
def __str__(self):
if None in self._attribs.values():
raise ValueError, "one of the attributes %r is not set" % (self._attribs.keys(),)
return self % self._attribs
def __call__(self, **kwargs):
for name, value in kwargs.items():
setattr(self, name, value)
return self % self._attribs
def __repr__(self):
return "%s(%s)" % (self.__class__.__name__, str.__repr__(self))
def attributes(self):
return self._attribs.keys()


import re
_findkeys = re.compile(r"%\((\w+)\)").findall
del re

-----------

You use it like this:

    TEST = mapstr("some%(one)s one\nsome%(two)s three\nsome%(three)s four")
    print TEST.attributes()
    TEST.one = "one"
    TEST.two = "thing"
    TEST.three = "where"
    print TEST
    s = str(TEST) # makes new, substituted, string
    assert s == "someone one\nsomething three\nsomewhere four"

This allows you to use mapping-substitution syntax on a special string object. But the substituted variables are attributes of the object. String-ifying it gets the new string with the substitutions made.



--
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Keith Dart <[EMAIL PROTECTED]>
   public key: ID: F3D288E4
   =====================================================================
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to