1

我正在做一个 Pyramid 项目,并且正在考虑稍后会出现的东西。我的特定用例是提升资源树以构建面包屑,但我也对一般实现感到好奇。

在 Python 代码中,我想要这个:

while resource is not None:
    pass  # do something with resource
    resource = resource.__parent__

但是在 Chameleon 中,你只会得到tal:repeat,这是一个for循环。我可以感觉到您可以编写一个将提供给模板的函数:

def ascend(resource):
    while resource is not None:
        yield resource
        resource = resource.__parent__

然后可以将其用作tal:repeat="item ascend(resource)".

因此,这可以推广到一个while循环:

def while_(value, condition, suite):
    while condition(value):
        yield value
        value = suite(value)

用法:tal:repeat="item while_(resource, lambda resource: resource is not None, lambda resource: resource.__parent__)"。丑陋。我认为你会很快进入专精领域!

类似地,如果break支持,则可以进行无限for循环。但事实并非如此。(我认为,支持它也不明智。

有没有更好或更简单的方法来实现这一点?(一般情况或我的具体情况。)

4

1 回答 1

3

不,没有。

Chameleon 模板并不意味着实现复杂的逻辑。最初的 Zope Page Template 理念是将所有业务逻辑留给 Python 代码,而模板的功能刚好足以将生成的信息转化为演示文稿,仅此而已。

这就是为什么 Chameleon 只给你一个 for 循环。遍历复杂结构不是模板的职责,它的职责仅限于创建已处理数据的表示。

于 2013-01-17T12:52:54.967 回答