2012-12-02 20 views
1

時,下面的例子來自Mako docs實際上不起作用:真子:NameError使用全局變量

<% 
    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,它應該可以工作。

回答

1

文檔中給出的模板實際上並沒有做任何事情,因爲它甚至沒有調用inner()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 

當您通過self命名空間中調用outer(),這就是所謂的一個不同的變量範圍內,這樣你就不會在得到「x」在那裏。 「x」是在「body」def中定義的,因此只有在body()中定義的調用outer()纔會有「x」。

+0

謝謝。那麼是否有'$ {outer()}'的標籤含水量? ('<%outer/>'不起作用,''也不起作用)。還是你只是想強制全局變量訪問的函數調用語法? –

+0

是啊,我測試過,如果我補充說,保證本地接入和現在有沒有一個語法。問題是,在你的模板中'<% a = 5 %>'不是「全局」,它是body()的局部。一個全球性的東西,你可以得到使用''<%! %>塊,所以也許你正在尋找[可繼承屬性(http://docs.makotemplates.org/en/latest/inheritance.html#inheritance-attr)。 – zzzeek

+0

如果有這方面的一些言論在http://docs.makotemplates.org/en/latest/defs.html爲閱讀*所有DEFS,頂層或不經過這會有所幫助,有機會獲得當前的上下文的命名空間恰好就像它們包含的模板一樣。*我也有印象'x'。 –