Frage

Ich möchte eine Lookup-Funktion mit mako einzurichten. oben auf der Vorlage, ich habe

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

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

, damit ich es kann später verwendet werden

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

das gibt mir eine Funktion ist kein definierter Fehler. kann ich das umgehen?

Ich weiß, warum es nicht funktioniert, wie es zuerst ausgeführt wird, bevor die Methode geladen wird, aber wie sonst wäre gesetzt ich diese auf?

War es hilfreich?

Lösung

Ich kann Ihnen sagen, warum es nicht funktioniert, aber ich habe nicht eine saubere Lösung an dieser Stelle. Ihre Vorlage als gegeben compiliert in diesem Python-Code:

# -*- 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()

Wie Sie Ihre function sehen kann, wurde tatsächlich als render_function definiert. Die Mako docs angeben, wie defs von rufen außerhalb einer Vorlage , aber sie tun nicht zeigen, wie diese zur Laufzeit richtig zu machen. Der Code, dass ich zu einfach verknüpft habe einen Nachschlag für "render_%s" % name (siehe mako.template, Linie 217), so dass Sie Macht Man denke nur an das zu tun.

Andere Tipps

Vielleicht könnten Sie bei der Suche function von dict-Erstellungszeit Aufruf Zeit verzögern?

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

Ich habe Mako nicht benutzt, aber es funktioniert in der 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top