Функция поиска Python - PullRequest
       4

Функция поиска Python

0 голосов
/ 01 октября 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 02 октября 2010

Я могу сказать вам, почему это не работает, но у меня нет чистого решения на данный момент.Ваш шаблон как дано компилируется в этот код 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. В документации Mako указано, как вызывать def из-за пределов шаблона , но они не указывают, как это сделать правильно во время выполнения.Код, который я тоже связал, просто выполняет поиск "render_%s" % name (см. Mako.template, строка 217), так что вы могли бы подумать над тем, чтобы сделать это.

1 голос
/ 02 октября 2010

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

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

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