2010-10-01 3 views
0

Я хочу настроить функцию поиска с помощью mako. в верхней части шаблона, у меня естьФункция поиска на Python

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

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

так что я могу использовать его позже

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

это дает мне функция не определена ошибка. могу я обойти это?

Я знаю, почему он не работает, поскольку он запускается первым, прежде чем метод загрузится, но как еще я это установлю?

ответ

1

Я могу сказать вам, почему это не работает, но у меня нет чистого раствора при этом точка. Ваш шаблон, как указано компилирует в этот 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() 

Как вы можете видеть ваш function фактически был определен как render_function. The Mako docs specify how to call defs from outside a template, но они не указывают, как правильно это сделать во время выполнения. Код, который я связал слишком просто, выполняет поиск для "render_%s" % name (см. Mako.template, строка 217), поэтому вы можете использовать .

+0

спасибо, у меня была общая идея, почему, но не уверен, что лучший способ ее решить - без каких-либо команд if/switch – Timmy

1

Возможно, вы могли бы отложить поиск function от времени создания dict до времени вызова?

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

Я не использовал Мако, но он работает в оболочке 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

nope, приятно попробовать. Я думаю, что в mako он ищет функцию в глобальном масштабе, но это не глобально. спасибо! – Timmy

Смежные вопросы