2011-09-16 1 views
3

J'utilise Pyramid et Mako pour modéliser.Fonctions Python dans les modèles Mako (pas dans les blocs de niveau module)

Il est possible de définir une fonction (semi-anonyme) dans un bloc Mako <% et %>. Je sais que cela peut être fait avec un bloc au niveau du module <%! et %>, mais cela signifie que ma fonction n'a aucun accès à la portée locale lors de la modélisation, ce qui signifie que je dois passer chaque bit de variable en ce que je avoir besoin.

Exemple:

...template... 
<% 
variable_in_local_scope = 'blah blah blah' 
def my_function(): 
    header_name = variable_in_local_scope.upper() 
    return header_name 
%> 
${foo()} 

Cela jette un NameError dire header_name n'est pas défini. La seule façon de contourner cela est de coder comme

<%! 
def my_function(input_variable): 
    return input_variable.upper() 
%> 
${my_function(variable_in_local_scope)} 

Cela fonctionne, mais quand il y a plus de quelques variables pour la fonction, il devient tout à fait unweildy. Je dois également réimporter toutes les fonctions 'helper' disponibles pour mon template dans le module-level-block.

Y a-t-il un moyen de contourner cela, ou est-ce que je fais quelque chose de complètement stupide?

Répondre

3

Ajouter un dictionnaire dans votre contexte en utilisant:

template.render(local_vars={}) 

puis l'utiliser dans vos fonctions.

Note: Mako est trop rapide, car le moteur va créer un module python pour chaque * .mak (fichier modèle) avant de le rendre, vous pouvez essayer ceci:

from mako.template import Template 
mytemplate = Template(filename='/docs/mytmpl.txt', module_directory='/tmp/mako_modules') 
print mytemplate.render() 

et de vérifier le contenu de *. Fichiers py dans '/ tmp/mako_modules'

0

avez-vous essayé: locals()["header_name"] = ...

Questions connexes