Cheetah的#include不将#define放入作用域中

2 投票
2 回答
601 浏览
提问于 2025-04-16 18:20

当我使用 #include 来引入一个文件时(不带 raw),它能正确解析内容,但我想在原始文件中访问的 #def 却不存在,因此会出现错误。

基础模板:

#def sayHello($name)
hello $name
#end def

模板:

#include "../../BaseTemplate.template"
$sayHello("fred")

2 个回答

0

看起来你可以通过某个属性来做到这一点:

self._CHEETAH__cheetahIncludes

这个属性是一个字典,里面包含了你所有的包含项。

在模板中使用它,方法是在包含之后这样写:

 $self._CHEETAH__cheetahIncludes[include_id].the_function(*args)

对我来说,include_id 恰好是文件路径(我通过先打印出 _CHEETAH__cheetahIncludes 字典发现的,嘿嘿)。这能保证吗?我也不知道。

我推荐这样做吗?不推荐。有更好的方法来访问这个功能吗?看起来没有。有缺点吗?我也不清楚,使用时请自担风险。这对某些人有用吗?也许吧 :)

我觉得这可能是个有用的功能,因为有人在尝试这样做,但这个功能真的必要吗?可能不是。

我的情况是,我想重用一个代码片段,这个片段能像包含项那样访问父级的搜索列表,但我想在其他模板中用一个硬编码的参数来重用这个包含项。其实我完全可以把这个变量做成改变搜索列表行为的一部分,这可能也是你应该做的 :)。这样我就可以从应用层传递参数,而不是在模板中硬编码!

这很可能是个好的设计,因为它防止了我们开发者在被允许的情况下常常采取的捷径。

2

出现这个问题的原因是,sayHello 是一个添加到“基础模板”(其实是一个类)里的函数,但在调用模板时,你无法直接访问它。

我不太确定解决你遇到的问题的最佳方法,但我认为你可以把 defHello 变成一个静态方法,在 def 这一行之前加上 #@staticmethod,然后导入模板,而不是直接包含它。

这个页面有更多信息。

撰写回答