变色龙中的“while”循环?

时间:2013-01-17 10:51:35

标签: python pyramid chameleon template-tal

我正在开展金字塔项目,正在考虑将来会有的事情。我的特殊用例是提升资源树来构建一个面包屑,但我对一般实现也很好奇。

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

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

但在变色龙中,你只能获得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循环可以。但事实并非如此。 (我认为,支持它也不是明智之举。

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

1 个答案:

答案 0 :(得分:3)

不,没有。

变色龙模板并不意味着实现复杂的逻辑;原始的Zope页面模板的理念是将所有业务逻辑留给Python代码,模板具有足够的能力将生成的信息转换为演示文稿,仅此而已。

这就是为什么Chameleon不会给你任何东西而不是for循环;遍历复杂结构的模板不是它的责任,它的责任仅限于创建已经处理过的数据的表示。