I wanted to use templates like
'my list has $len($myList) objects; the first is named $myList.name.upper()'
... but, of course, that sort of stuff is impossible with str.Template. I created a bunch of code to populate a dictionary to pass to str.Template, but that was clunky, and defeated the purpose of having a template that clearly describes its own contents. In Cheetah, it's perfectly straightforward.
from Cheetah.Template import Template
tmplt = 'my list has $len($myList) objects; the first is named $myList.name.upper()'
print Template(tmplt, [locals(),globals()])
The second argument is the list of dictionaries Cheetah will search for matches to variables in the Template. Using [locals(), globals()] is my way to cheat and say, "Look wherever the interpreter would".