Вызов def как функции в шаблоне Mako

Я хотел бы использовать def как функцию и вызывать ее из блока if:

<%def name="check(foo)">
    % if len(foo.things) == 0:
        return False
    % else:
        % for thing in foo.things:
            % if thing.status == 'active':
                return True
            % endif
        % endfor
    % endif
    return False
</%def>

% if check(c.foo):
    # render some content
% else:
    # render some other content
% endif

Излишне говорить, что этот синтаксис не работает. Я не хочу просто выполнять подстановку выражения (и просто отображать вывод определения), поскольку логика непротиворечива, но отображаемый контент отличается от места к месту.

Есть ли способ сделать это?

Редактировать: включение логики в определение в <% %> кажется правильным решением.


person Hollister    schedule 20.01.2011    source источник


Ответы (2)


Просто определите всю функцию на простом Python:

<%!
def check(foo):
    return not foo
%>
%if check([]):
    works
%endif

Или вы можете просто определить функцию в Python и передать ее контексту.

person Jochen Ritzel    schedule 20.01.2011
comment
Хорошо, но есть ли преимущество перед Python в mako def? - person Hollister; 20.01.2011
comment
@Hollister: Что ж, определения Mako имеют слишком много интересных функций, чтобы перечислять их здесь (self.caller, self.body и т. д., прочитайте учебник по Mako), но если вы не используете ни одну из них, вы можете использовать более простой синтаксис Python. - person Jochen Ritzel; 20.01.2011
comment
Прав ли я, думая, что это не позволяет переопределить функцию check вниз по дереву наследования, тогда как определение check как %def с телом в простом Python позволяет как вызывать ее как обычную функцию Python, так и переопределять ее? - person Piotr Dobrogost; 22.08.2014

Да, использование простого синтаксиса Python в def работает:

<%def name="check(foo)">
  <%
    if len(foo.things) == 0:
        return False
    else:
        for thing in foo.things:
            if thing.status == 'active':
                return True

    return False
  %>
</%def>

Если кто-то знает лучший способ, я хотел бы услышать его.

person Hollister    schedule 20.01.2011