string.Template question

W

Wells Oliver

Can you use dicts with string.Template?

e.g. a structure like:

game = {
'home': {'team': row['home_team_full'], 'score': row['home_score'],
'record': '0-0', 'pitcher': {
'id': home_pitcher.attrib['id'], 'name':
home_pitcher.attrib['last_name'], 'wins': home_pitcher.attrib['wins'],
'losses': home_pitcher.attrib['losses']
}, 'win': home_win}
}

Then, in the template, 'game' is passed, but I want to access like
$home.pitcher.id

This doesn't seem to work, though. Is it possible? Or must everything
in the dict passed to string.Template be one-level deep string
variables?
 
P

Peter Otten

Wells said:
Can you use dicts with string.Template?

e.g. a structure like:

game = {
'home': {'team': row['home_team_full'], 'score': row['home_score'],
'record': '0-0', 'pitcher': {
'id': home_pitcher.attrib['id'], 'name':
home_pitcher.attrib['last_name'], 'wins': home_pitcher.attrib['wins'],
'losses': home_pitcher.attrib['losses']
}, 'win': home_win}
}

Then, in the template, 'game' is passed, but I want to access like
$home.pitcher.id

This doesn't seem to work, though. Is it possible? Or must everything
in the dict passed to string.Template be one-level deep string
variables?

If you're unclear about the capabilities of a piece of python it's time to
have a look at the source code ;)

My conclusion: you can make string.Template accept dotted variables and
nested dicts, but not without subclassing and a few lines of custom code.

$ cat extended_template.py
import string

class DotDict(object):
def __init__(self, d):
self._nested = d
def __getitem__(self, key):
result = self._nested
for k in key.split("."):
result = result[k]
return result

class Template(string.Template):
idpattern = r'[_a-z][_a-z0-9.]*'

def substitute(self, *args, **kw):
assert not kw
[d] = args
return string.Template.substitute(self, DotDict(d))

if __name__ == "__main__":
game = {"home": {"pitcher": {"id": 42}}}
print Template("home/pitcher/id is $home.pitcher.id").substitute(game)

$ python extended_template.py
home/pitcher/id is 42

Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top