2010-10-01 9 views
0

Je souhaite configurer une fonction de recherche avec mako. au-dessus du modèle, j'aiFonction de recherche Python

<%! 
    lookup = { 'key': function } 
%> 

<%def name="function()"> 
    Output 
</%def> 

afin que je puisse l'utiliser plus tard

<%def name="body()"> 
    ${lookup['key']()} 
</%def> 

cela me donne une fonction est pas une erreur définie. Puis-je contourner cela?

Je sais pourquoi cela ne fonctionne pas, car il s'exécute en premier, avant que la méthode soit chargée, mais comment pourrais-je configurer cela?

Répondre

1

je peux vous dire pourquoi il ne fonctionne pas, mais je n'ai pas une solution propre à ce point. Votre modèle comme indiqué compile en code Python:

# -*- encoding:utf-8 -*- 
from mako import runtime, filters, cache 
UNDEFINED = runtime.UNDEFINED 
__M_dict_builtin = dict 
__M_locals_builtin = locals 
_magic_number = 5 
_modified_time = 1285968547.0498569 
_template_filename='<snip>' 
_template_uri='<snip>' 
_template_cache=cache.Cache(__name__, _modified_time) 
_source_encoding='utf-8' 
_exports = ['function'] 


# SOURCE LINE 1 

lookup = { 'key': function } 


def render_body(context,**pageargs): 
    context.caller_stack._push_frame() 
    try: 
     __M_locals = __M_dict_builtin(pageargs=pageargs) 
     __M_writer = context.writer() 
     # SOURCE LINE 3 
     __M_writer(u'\n\n') 
     # SOURCE LINE 7 
     __M_writer(u'\n') 
     return '' 
    finally: 
     context.caller_stack._pop_frame() 


def render_function(context): 
    context.caller_stack._push_frame() 
    try: 
     __M_writer = context.writer() 
     # SOURCE LINE 5 
     __M_writer(u'\n Output\n') 
     return '' 
    finally: 
     context.caller_stack._pop_frame() 

Comme vous pouvez voir votre function a effectivement été défini comme render_function. The Mako docs specify how to call defs from outside a template, mais ils n'indiquent pas comment le faire correctement lors de l'exécution. Le code que j'ai lié trop simplement fait une recherche pour "render_%s" % name (voir mako.template, ligne 217), de sorte que vous pourrait envisager de le faire.

+0

merci, j'ai eu une idée générale pourquoi, mais pas sûr que la meilleure façon de le résoudre est, sans un tas de déclarations de flux if/switch – Timmy

1

Peut-être que vous pourriez retarder la recherche de function de l'heure de création de dict à l'heure d'invocation?

<%! 
    lookup = { 'key': lambda: function() } 
%> 

Je ne l'ai pas utilisé Mako, mais il fonctionne dans le shell Python:

>>> x = lambda: foo() 
>>> x 
<function <lambda> at 0x10047e050> 
>>> x() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <lambda> 
NameError: global name 'foo' is not defined 
>>> def foo(): 
... print "Test" 
... 
>>> x() 
Test 
+0

non, bien essayer cependant. Je pense que dans mako il recherche la fonction dans le global, mais ce n'est pas global. THX! – Timmy