【问题标题】:Access variables defined in Mako namespace访问 Mako 命名空间中定义的变量
【发布时间】:2011-07-14 16:45:13
【问题描述】:

通常,在 Mako 中“导入”命名空间似乎只允许访问 defs。

## base.mako
<%
  somevar = ["one", "two", "three"]
%>

<%def name="foo()">Bar</%def>

还有一个导入模板:

## child.mako
<%namespace name="base" file="base.mako" />

${base.foo()} # works
${base.somevar} # fails: no soup for you

在我的用例中,somevarfoo 是相关的。我也可以从导入模板中访问somevar,这会很方便。这样做的最佳做法是什么?

【问题讨论】:

  • 添加getSomeVar()函数不是一个选项吗?
  • @9000:通常somevar 将是一个任意的python 对象,用作函数或def 的参数,而不仅仅是渲染时输出到模板主体的字符串。对不起,我很抱歉:在这种情况下,我该如何编写/调用 getSomeVar()?
  • 您可以导入函数 foo,但不能导入普通名称 somevar。您可以在 base 中定义 def getSomeVar(): return somevar,并希望像使用 somevar 一样使用 base.getSomeVar()

标签: python mako


【解决方案1】:

我也遇到过同样的问题 - 答案在关于继承的文档中:

命名空间对象的 attr 访问器允许访问在模板中声明的模块级变量。通过访问 self.attr,您可以访问继承链中的常规属性,如 个部分。

所以你想要base.attr.somevar我想。

【讨论】:

【解决方案2】:

正如上面用户 9000 所建议的,我想出了一种方法来做到这一点。我发布它是为了记录它以防其他人需要它,但我仍然希望有更多专业知识的人可以提供更好的方法。

据我所知,您无法通过命名空间访问模块块中定义的函数,但您可以访问&lt;%def&gt;。默认情况下&lt;%def&gt; 块直接转储到上下文缓冲区,所以你必须做一些扭曲:

## base.mako
<%!
  somevar = ["one", "two", "three"]
%>

<%def name="getSomeVar()">
  <%
    return somevar
  %>
</%def>

然后从另一个模板导入 base.mako 命名空间为base 并访问${base.getSomeVar()} 以获取somevar 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2020-07-10
    • 2017-04-30
    相关资源
    最近更新 更多