[Python-Dev] PEP 292 for Python 2.4

Raymond Hettinger python at rcn.com
Wed Jun 16 06:37:38 EDT 2004


> > For completeness, perhaps update the PEP to specify what will happen
> > with $ strings that do not fall under $$, $indentifier, or
> > ${identifier}.
> 
> Good point, I've pushed out an update.

Thanks.


 
> > The names dstring(), astring(), safedict(), and nsdict() could
likely be
> > improved to be more suggestive of what they do.
> 
> The 'd' is a mnemonic for 'dollar strings'.  Similarly 'a' is for
> 'attribute path'.  'safedict' is meant to imply that it will not throw
> KeyError exceptions, and 'nsdict' indicates that namespace lookups are
> used.  I'm certainly open to alternative suggestions

Since this is in a string module, the "string" part of the name can be
more abbreviated and the qualifier should be less abbreviated.

dstring:    dollarstr, formatstr, dollarfmt, template, kwdonly
astring:    attrstr, attrlookup, dottedfmt, kwdattr
safedict:   defaultdict, 
nsdict:     nslookup, namespace, envdict

Cheetah has been through several versions.  Perhaps, they have worked
out some better naming conventions.



> I don't think documentation is a problem.  I'd propose (and would even
> write) splitting the current string module so that the deprecated
> functions are described in a subsection that doesn't appear on the
main
> module page.  That way, the documentation just describes the constants
> we want to keep and the new PEP 292 support (perhaps in another new
> subsection).

That's reasonable.  A string module is the natural place to locate the
simplified substitutions.  Splitting out the old functions seems like a
good way to re-use the string module without breathing life into things
that I was hoping that people would forget ever existed (otherwise, we
will never be rid of them).

Please do give consideration to putting all of this in a single module.
IMO, this is too small of an addition to warrant splitting everything in
to packages (which make it more difficult to understand and maintain as
a collective unit).



> > Can safedict.safedict() be made more general so that it has value
> > outside of string substitutions.
> 
> It's such a trivial matter to subclass from dict and write your own
> __getitem__() that I doubt it's worth it.

True enough.  Do consider having an optional argument for setting the
default string.  Ideally, the class should be useful with both $
formatted and % formatted strings (for instance, make it return the key
unchanged when the key is not found).  Also, since the implementation is
so tightly bound to $ formatting, it makes no sense to put it in a
separate module.



> > Given the simplicity of the PEP, the sandbox implementation is
> > surprisingly intricate.  Is it possible to simplify it with a
function
> > based rather than class based approach?
> 
> Take away all the comments, and it's really a fairly simple
> implementation.  I really want to use traditional % syntax to perform
> the substitutions since that's the Pythonically natural way to spell
> string interpolation. 

The overall goal of the PEP is simplification.  It takes very little
complexity before $ formatting becomes more complicated than %
formatting.

The % syntax has its share of issues (hard to find in the docs;
precedence is more appropriate for integer modulo; tuple vs single
string argument).

If you give up the % syntax, you get perfectly pythonic method calls and
an opportunity to do the whole job with only one exposed,
differentiating the approaches with various method names:

t = Template('$who owes me ${what')
t.subst_from_dict(mydict)
t.subst_from_env()
t.subst_from_attr()
t.subst(mydict, noexception=True)


Something like this would mean that you don't need several different
classes to do the job.  Also, compare the following for obviousness and
readability:

Template('$name loves $spouse').subst(mydict, noexception=True)
dstring('$name loves $spouse') % SafeDict(mydict)



>  In an i18n application you need the original string for
> catalog lookup, and the transformed string is only useful for the mod
> operation.

That settles that one.



Raymond




More information about the Python-Dev mailing list