2

我尝试为 jinja2 做扩展。我写了这样的代码:

http://dumpz.org/12996/

但我收到异常:'NoneType' object is not iterable. 错误在哪里?那应该返回parse。还有什么应该接受和返回_media

4

1 回答 1

11

您正在使用CallBlock,这表示您希望您的扩展程序充当一个块。例如

{% mytest arg1 arg2 %}
stuff
in
here
{% endmytest %}

nodes.CallBlock期望您向它传递代表扩展的主体(内部语句)的节点列表。目前这是您要经过的地方None- 因此是您的错误。

解析完参数后,您需要继续解析块的主体。幸运的是,这很容易。你可以简单地做:

body = parser.parse_statements(['name:endmytest'], drop_needle=True)  

然后返回一个新节点。CallBlock接收一个要调用的方法(在本例中),该方法_mytestfunc为您的扩展提供逻辑。

body = parser.parse_statements(['name:endmytest'], drop_needle=True)  
return nodes.CallBlock(self.call_method('_mytestfunc', args),[], [], body).set_lineno(lineno)

或者,如果您不希望您的扩展成为块标签,例如

{% mytest arg1 arg2 %}

你不应该使用nodes.CallBlock,你应该只使用nodes.Call它,它不带 body 参数。所以就这样做:

return self.call_method('_mytestfunc', args)  

self.call_method只是一个方便的包装函数,它为您创建一个 Call 节点。

我花了几天时间编写 Jinja2 扩展,这很棘手。没有太多文档(除了代码)。coffin GitHub 项目在这里有一些扩展示例。

于 2009-11-25T13:36:49.480 回答