0

我想用 mako 设置一个查找功能。在模板之上,我有

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

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

所以我以后可以使用它

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

这给了我一个函数不是定义的错误。我可以解决这个问题吗?

我知道为什么它不工作,因为它首先运行,在方法被加载之前,但我该怎么设置呢?

4

2 回答 2

1

也许您可以将查找function从字典创建时间延迟到调用时间?

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

我没有用过 Mako,但它在 Python shell 中工作:

>>> 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
于 2010-10-01T20:27:12.497 回答
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. Mako 文档指定了如何从模板外部调用 defs,但没有说明如何在运行时正确执行此操作。我链接的代码也只是进行了查找"render_%s" % name(参见 mako.template,第 217 行),因此您可能会考虑这样做。

于 2010-10-01T21:30:34.137 回答