Вызов def как функция в шаблоне Mako - PullRequest
2 голосов
/ 20 января 2011

Я бы хотел использовать 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

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

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

Edit: Заключение логики в определение в <% %>, похоже, является наилучшим решением.

Ответы [ 2 ]

5 голосов
/ 20 января 2011

Просто определите всю функцию в обычный Python :

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

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

1 голос
/ 20 января 2011

Да, используя простой синтаксис 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>

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

...