在Mako模板中调用def作为函数

4 投票
2 回答
4391 浏览
提问于 2025-04-16 10:19

我想把一个 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 的输出),因为逻辑是一致的,但不同地方显示的内容却不一样。

有没有什么办法可以做到这一点呢?

编辑:def 里的逻辑用 <% %> 包起来,似乎是个可行的办法。

2 个回答

2

是的,在定义函数的时候使用普通的Python语法是可以的:

<%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>

如果有人知道更好的方法,我很想听听。

7

只需要用普通的Python来定义整个函数:

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

或者你也可以直接在Python中定义这个函数,然后把它传递到上下文中。

撰写回答