On Fri, Oct 31, 2003 at 07:51:55AM -0700, Jonathan Corbet wrote:
> > One way to buy back performance would be to make templates return
> > TemplateIO objects rather than strings or htmltext objects.
>
> I'm not sure I understand how this would work. Is the idea that literal
> strings would become strings again, and the TemplateIO object, somehow,
> tracks whether each component string is "clean" or not?
No. The current TemplateIO is a mutable character buffer. htmltext
data gets copied into it. At the end of the template a new htmltext
object gets created from the data. So, for each template, data is
copied in and out of the TemplateIO buffer (at least for the C
implementation).
I'm proposing that the TemplateIO object reference htmltext objects
rather than coping the data. Templates would return TemplateIO
objects rather than htmltext. I don't know if I'm explaining it
very well. Perhaps some code would be clearer:
class TemplateIO:
def __init__(self):
self.data = []
def __iadd__(self, value):
if value is None:
pass
elif isinstance(value, htmltext):
self.data.append(value)
elif isinstance(value, TemplateIO):
self.data.extend(value.data)
else:
self.data.append(htmlescape(value))
def getvalue(self):
return htmltext('').join(self.data)
The important optimization is the part that handles other TemplateIO
objects using extend(). For the C implementation it might be more
efficient to build a tree rather than always flattening it.
Neil