1

Mako docsの次の例は、実際には機能しません。

<%
    x = 12
%>
<%def name="outer()">
    <%
        y = 15
    %>
    <%def name="inner()">
        inner, x is ${x}, y is ${y}
    </%def>

    outer, x is ${x}, y is ${y}
</%def>

以下を追加<%self:outer />してdefを呼び出すと(ファイルには他に何もありません)、ページでエラーが発生し、Apacheログに次のように表示されます

[Sun Dec 02 13:25:08 2012] [error] [client 89.247.172.1]   File "/tmp/mako_template_cache/index.html.mako.py", line 82, in render_outer
[Sun Dec 02 13:25:08 2012] [error] [client 89.247.172.1]     __M_writer(str(x))
[Sun Dec 02 13:25:08 2012] [error] [client 89.247.172.1]   File "/usr/lib/python3/dist-packages/mako/runtime.py", line 195, in __str__
[Sun Dec 02 13:25:08 2012] [error] [client 89.247.172.1]     raise NameError("Undefined")
[Sun Dec 02 13:25:08 2012] [error] [client 89.247.172.1] NameError: Undefined

私は何が間違っているのでしょうか?私は Debian から Mako 0.7.0 を持っています。

4

1 に答える 1

1

inner()ドキュメントで指定されているテンプレートは、 orを呼び出していないため、実際には何もしませんouter()。ドキュメントが説明している使用法は、ローカル関数呼び出しです。

from mako.template import Template

print Template("""
<%
    x = 12
%>
<%def name="outer()">
    <%
        y = 15
    %>
    <%def name="inner()">
        inner, x is ${x}, y is ${y}
    </%def>

    outer, x is ${x}, y is ${y}

    ${inner()}
</%def>

${outer()}

""").render()

出力:

outer, x is 12, y is 15


    inner, x is 12, y is 15

outer()名前空間を介して呼び出すselfと、別の変数スコープ内で呼び出されるため、「x」にはなりません。「x」は「body」定義内で定義されているため、body() で定義されているように outer() を呼び出す場合にのみ、「x」が存在します。

于 2012-12-23T18:14:40.600 に答える