pystache:在lambda中渲染上下文

时间:2013-12-17 17:33:37

标签: python mustache

这与https://github.com/defunkt/pystache/issues/157非常相似,但在上述帖子中并没有真正回答......

我的目标:打印以下行:

Al,John,Jack
Tim,Tom,Todd

没有最后一个逗号。

我试过这种方式:

ctx = {
    'gangs': [
        {'gangsters': [ {'name': 'Al' }, {'name': 'John'}, {'name': 'Jack'}]},
        {'gangsters': [ {'name': 'Tim'}, {'name': 'Tom'} , {'name': 'Todd'}]},
    ]
}


class Lambdas(object):
    def __init__(self, renderer):
        self.renderer = renderer

    def rstrip(self):
        "Remove last character"
        print self.renderer.context
        return lambda s: self.renderer.render(s, self.renderer.context)[:-1]

renderer = pystache.Renderer(missing_tags='strict')

print renderer.render("""
    {{#gangs}}
        {{#rstrip}}{{#gangsters}}{{name}},{{/gangsters}}{{/rstrip}}
    {{/gangs}}
""", ctx, Lambdas(renderer))

输出:

ContextStack({'gangs': [{'gangsters': [{'name': 'Al'}, {'name': 'John'}, {'name': 'Jack'}]}, {'gangsters': [{'name': 'Tim'}, {'name': 'Tom'}, {'name': 'Todd'}]}]}, <__main__.Lambdas object at 0x15cadb10>, {'gangsters': [{'name': 'Al'}, {'name': 'John'}, {'name': 'Jack'}]})
ContextStack({'gangs': [{'gangsters': [{'name': 'Al'}, {'name': 'John'}, {'name': 'Jack'}]}, {'gangsters': [{'name': 'Tim'}, {'name': 'Tom'}, {'name': 'Todd'}]}]}, <__main__.Lambdas object at 0x15cadb10>, {'gangsters': [{'name': 'Al'}, {'name': 'John'}, {'name': 'Jack'}]})

Al,John,Jack
Al,John,Jack

罪魁祸首是在rstrip中调用render()。请注意,在第二次调用期间,ContextStack的3d元素与前一个调用完全相同。

这是一个错误,还是我错过了什么?!?

1 个答案:

答案 0 :(得分:2)

回答上游:https://github.com/defunkt/pystache/issues/158

def rstrip(self):
    "Remove last character"
    return lambda s: copy.deepcopy(self.renderer).render(s, self.renderer.context)[:-1]