名称空间继承意外行为

时间:2013-12-11 21:04:38

标签: inheritance namespaces mako function

a.mako

<%def file="one()">
    ${ two() }
</%def>

<%def file="two()">
    two
</%def>

b.mako

<%inherit file="a.mako" />
<%def file="two()">
    overriden two
</%def>

我希望将 b.mako 用作

这样的命名空间
<%namespace name="test_namespace" file="b.mako" />
${ one() }

我期待overriden two,但它仍然是two

1 个答案:

答案 0 :(得分:0)

诀窍在self

我应该写

<%def file="one()">
    ${ self.two() }
</%def>

文件部分涵盖了

http://docs.makotemplates.org/en/latest/inheritance.html#but-what-about-defs

在上面,title()def,因为它是def中的def,不是模板导出的命名空间的一部分,也不会成为self的一部分。如果继承的模板确实在顶层定义了自己的标题def,那么它将被调用,但无论如何,上面的“默认标题”根本不存在。