Cheetah的#include不将#define放入作用域中
当我使用 #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
,然后导入模板,而不是直接包含它。
这个页面有更多信息。