[stringtemplate-interest] Python StringTemplate: defining __len__ for class rendered by subtemplate gives empty result

Wray, Paul Paul.Wray at det.nsw.edu.au
Wed Feb 10 18:59:50 PST 2010


Hello
I've started to use Python StringTemplate (very nice, thank you!), and I
ran into a surprise that took me a while to track down. Maybe it
deserves a note in the documentation or perhaps even a rework of part of
the code? In any case this note may help others.
The essence of the problem is shown in the code below. Class B defines
an instance (a) of Class A, and renders it in a (named or anonymous)
subtemplate, passing (a) either implicitly or explicitly to the
subtemplate.

The code works fine unless Class A defines a __len__ function for its
own purposes, which happens to return 0. Then, depending on which form
of call is used, either the subtemplate is not rendered at all, or the
attribute reference within the subtemplate gives an empty result.

import stringtemplate3 as st3
from stringtemplate3.language import DefaultTemplateLexer
import StringIO

groupStr = '''
    group testGroup;
    Atemplate(it) ::= <<
        $it.value$
    >>

    Btemplate(object) ::= <<
        $object.a.value$
        $object.a:{ $it.value$ }$
        $object.a: { itm | $itm.value$ }$
        $object.a:Atemplate()$
        $Atemplate(it=object.a)$
    >>
'''

class A(object):
    def __init__(self):
        self.value = 'value'
    
    # if subtemplate-rendered class defines __len__, templates are
empty.
    #def __len__(self):
    #    return 0
        
class B(object):

    def __init__(self):
        self.a = A()

    def render(self, group):
        template = group.getInstanceOf('Btemplate')
        template['object'] = self
        return template.toString()

if __name__ == '__main__':
    group = st3.StringTemplateGroup(file=StringIO.StringIO(groupStr),
lexer=DefaultTemplateLexer.Lexer)    
    b = B()
    print b.render(group)
**********************************************************************
This message is intended for the addressee named and may contain
privileged information or confidential information or both. If you
are not the intended recipient please delete it and notify the sender.
**********************************************************************


More information about the stringtemplate-interest mailing list