Evaluating Code Inside Strings
Credit: Joonas Paalasmaa
Problem
You have a string that contains embedded Python expressions, and you need to copy the string while evaluating those expressions.
Solution
This recipe’s trick is to use the
% string-formatting
operator’s named-values variant. That variant
normally takes a dictionary as the righthand operand, but in fact it
can take any mapping, so we just prepare a rather special mapping for
the recipe’s purpose:
class Eval:
""" mapping that does expression evaluation when asked to fetch an item """
def _ _getitem_ _(self, key):
return eval(key)Now we can perform feats such as:
>>> number = 20
>>> text = "python"
>>> print "%(text.capitalize())s %(number/9.0).1f rules!" % Eval( )
Python 2.2 rules!Discussion
This recipe can be seen as a templating task, akin to Recipe 3.22 and Recipe 3.23, but it is substantially simpler, because it needs to handle only embedded expressions, not statements. However, because the solution is so much simpler and faster than the general templating ones, it’s better to think of this as a totally separate task.
In Python, the % operator of strings is typically
used for normal formatting. The values to be interpolated in the
string are the items of the righthand side, which is either a tuple,
for unnamed-value formatting, or a mapping, for named-value
formatting (where format items have forms such as
%(name)s). The mapping is often obtained by
functions such as the built-in vars, which returns a dictionary that represents ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access