2012-12-02 3 views
1

을 사용하는 경우는 Mako docs에서 다음 예제 실제로 작동하지 않습니다마코 : 나가서 설명하자면 NameError 전역 변수

나는 아래 <%self:outer />가 (아무 것도이 파일에 없음) 수비력 전화를 추가
<% 
    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> 

페이지를 오류가 발생하고 내 아파치 로그에 다음과 같이 표시됩니다.

[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 

내가 잘못 할 수 있습니까? 데비안에서 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/>'는 작동하지 않으며'<% body : 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에서 일부 발언을하면 도움이 될 것입니다. * 최상위 수준의 모든 def는 현재 상황 별 네임 스페이스에 정확히 액세스 할 수 있습니다. 그들의 포함하는 템플릿이하는 것과 같은 방식으로. * 나는 인상'x'도 볼 수있다. –

관련 문제