自定义Jinja2扩展的帮助

10 投票
1 回答
1929 浏览
提问于 2025-04-16 17:29

我一直在努力让这个Jinja2的自定义扩展正常工作——文档说写这个东西不适合“普通人”可不是开玩笑——最后我终于搞出了这段能用的代码:

class WrapperExtension(Extension):

    tags = set(['wrap'])

    def parse(self, parser):
        lineno = parser.stream.next().lineno
        args = [parser.parse_expression()]
        args.append(nodes.Const(args[0].name))
        return nodes.CallBlock(
            self.call_method('_render', args),
            [], [], []).set_lineno(lineno)

    def _render(self, value, name, *args, **kwargs):
        if some_condition():
            return '<wrapper id="%s">%s</wrapper>' % (name, value)
        return value

正如我所说,现在这个代码是可以工作的。不过我不太明白的是,为什么在parse()里需要返回nodes.CallBlock,而不是self.call_method()(它返回的是nodes.Call对象)。如果有人能给我一些见解——或者能指点我去哪里找写扩展的教程——请告诉我。

1 个回答

4

原因是,parse() 函数应该返回一个语句节点,比如 CallBlock 或者 Assign。而 call_method() 返回的是一个表达式节点,你需要把它放在 CallBlock 里面,才能变成一个语句。

撰写回答