2012-12-02 1 views
1

L'exemple suivant de la Mako docs ne fait fonctionne pas:Mako: NameError lors de l'utilisation variable globale

<% 
    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> 

Quand j'ajoute <%self:outer /> ci-dessous pour appeler à la définition (rien d'autre est dans le fichier), la page va sortir de l'erreur et mon journal apache dit

[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 

Que pourrais-je faire de mal? J'ai Mako 0.7.0 de Debian pour lequel cela devrait fonctionner.

Répondre

1

Le modèle tel qu'il est indiqué dans les documents ne fait en réalité rien car il n'appelle même pas inner() ou outer(). L'utilisation des documents décrivent est des appels de fonction locale:

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() 

sortie:

outer, x is 12, y is 15 


    inner, x is 12, y is 15 

lorsque vous appelez outer() via l'espace de noms self, qui est ce qu'on appelle dans une portée variable différente de sorte que vous ne recevez pas à "x" là. "x" est défini dans le "corps" def, donc seul l'appel de outer() tel que défini dans le corps() aura "x" présent.

+0

Merci. Donc, y a-t-il un marqueur aquivalent de '$ {outer()}'? ('<%outer/>' ne fonctionne pas, ni '<% body: outer />'). Ou avez-vous simplement voulu forcer la syntaxe d'appel de fonction pour l'accès à la variable globale? –

+0

ouais j'avais vérifié si j'avais ajouté une syntaxe qui garantit l'accès local et il n'y a pas maintenant. La chose est, en disant '<% a = 5 %>' dans votre modèle n'est pas "global", c'est local à body(). Un global est quelque chose que vous pouvez obtenir en utilisant un bloc '<%! %>', donc vous cherchez peut-être des [attributs héritables] (http://docs.makotemplates.org/en/latest/inheritance.html#inheritance-attr). – zzzeek

+0

Il serait utile s'il y avait une remarque à ce sujet à http://docs.makotemplates.org/en/latest/defs.html qu'après avoir lu * Tous les defs, de haut niveau ou non, ont accès à l'espace de noms contextuel actuel exactement de la même manière que leur modèle contenant. * J'ai eu l'impression «x» serait également visible. –

Questions connexes