1

私は Pyramid プロジェクトに取り組んでおり、後で何かを検討しています。私の特定のユース ケースは、リソース ツリーを上ってパンくずリストを作成することですが、一般的な実装にも興味があります。

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ループが実行されます。しかし、そうではありません。(また、それをサポートするのも賢明ではないと思います。

これを達成するためのより良い方法や簡単な方法はありますか? (一般的なケースまたは私の特定のケース。)

4

1 に答える 1

3

いいえ、ありません。

Chameleon テンプレートは、複雑なロジックを実装するためのものではありません。元の Zope Page Template の哲学は、すべてのビジネス ロジックを Python コードに任せることであり、テンプレートには、生成された情報をプレゼンテーションに変換するのに十分な力しかありません。

これが、Chameleon が for ループ以上のものを提供しない理由です。複雑な構造をトラバースするのはテンプレートの責任ではなく、その責任はすでに処理されたデータの表現を作成することに限定されています。

于 2013-01-17T12:52:54.967 に答える