Python 在Mako命名空间中定义的访问变量

Python 在Mako命名空间中定义的访问变量,python,mako,Python,Mako,通常,在Mako中“导入”命名空间似乎只允许访问DEF ## base.mako <% somevar = ["one", "two", "three"] %> <%def name="foo()">Bar</%def> ##base.mako 酒吧 和导入模板: ## child.mako <%namespace name="base" file="base.mako" /> ${base.foo()} # works ${base.

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

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

<%def name="foo()">Bar</%def>
##base.mako
酒吧
和导入模板:

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

${base.foo()} # works
${base.somevar} # fails: no soup for you
##child.mako
${base.foo()}#有效
${base.somevar}#失败:你没有汤

在我的用例中,
somevar
foo
是相关的。我还可以方便地从导入模板中访问
somevar
。这样做的最佳实践是什么?

正如上面用户9000所建议的,我找到了一种方法。我把它贴了出来,这样它就可以被记录下来,以防别人需要它,但我仍然希望有更多专业知识的人可以用更好的方式来插手

据我所知,您不能通过名称空间访问模块块中定义的函数,但可以访问
。默认情况下,
块直接转储到上下文缓冲区,因此您必须进行一些扭曲:

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

<%def name="getSomeVar()">
  <%
    return somevar
  %>
</%def>
##base.mako

然后从另一个模板导入base.mako名称空间作为
base
,并访问
${base.getSomeVar()}
,以获取
somevar
的值。我遇到了同样的问题-答案在关于继承的文档中:

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


因此,您需要
base.attr.somevar
我想。

添加
getSomeVar()
函数不是一个选项吗?@9000:通常
somevar
是一个任意python对象,在呈现时用作函数或def的参数,而不仅仅是输出到模板体的字符串。我很抱歉过于密集:在这种情况下,我如何编写/调用getSomeVar()?您可以导入函数foo,但不能导入简单的名称somevar。您可以定义
def getSomeVar():在base中返回somevar
,并希望像使用
somevar
一样使用
base.getSomeVar()
。这只适用于
,而不是常规的
:(