6

パフォーマンスのために、オブジェクトの呼び出しを避けるためにnocallonを使用することをお勧めします。<tal:condition>これは私には少しあいまいに聞こえるので、少し背景を教えていただければ幸いです:-)

では、いつ nocall を使用しますか? 私のすべての条件にそれを置くのは痛いですか?

ありがとう !

4

4 に答える 4

12

代わりに tal:condition="python: variable" を使用する傾向があります。そうすれば、デフォルトのパス式による魔法のような振る舞いを恐れることなく、常に通常の適切な Python 式を書くことができます。

パス式は多くのことを行います。たとえば、変数が呼び出し可能な場合は式で変数を呼び出します。多くの場合、TAL でツールやコンテンツ アイテムを扱いますが、これらはすべて呼び出し可能です。

最も一般的な間違いは、tal:condition="content_object" を使用することです。コンテンツ オブジェクトは、さまざまな API から取得される可能性があります。たとえば、あらゆる種類の参照フィールドを呼び出すと、コンテンツ オブジェクトが返されます。カタログ検索では「brains」が返されますが、リストではこれらのより多くの属性にアクセスする必要があることが多いため、tal:define="objbrain/getObject" を使用します。

コンテンツ オブジェクトを呼び出すと、ブラウザが要求したかのようにオブジェクトがレンダリングされます。通常、ページのレンダリングには 500 ミリ秒から 2 秒かかるため、その分だけページのレンダリングが遅くなります。これを 25 項目のループで行うと、ページのレンダリングに 30 秒以上かかると予想されます。

于 2011-04-01T14:52:25.917 に答える
5

nocallオブジェクトの属性またはメソッドへの「ハンドラ」を取得できます。オブジェクトにその属性またはメソッドがあるかどうかを知りたい場合は、次を使用する必要があります。

<div tal:condition="nocall:context/method|nothing">
  ...
</div>

は、Python コード|nothingのブロックと同様に機能します。失敗した場合 (未定義)、 を返します。(これは正確な説明ではないかもしれませんが、このように機能します)。exceptcontext/methodnothing

使用するもう 1 つの理由nocallは、定義済みで後で使用することがわかっているメソッドのハンドラーを取得することです。

<div tal:define="method nocall:context/method">
    <span tal:content="python:method(3)" />
    <span tal:content="python:method('hello')" />
    <span tal:content="python:method('whatever')" />
</div>
于 2011-04-01T14:51:48.203 に答える
1

nocall:そもそも呼び出し可能でないアイテムで既にテストされている条件にのみ追加することになると思います。おそらく、python 組み込みcallableテストを回避すると、パフォーマンスが向上する可能性があります。

その質問に対する短い答えはノーです。それはあなたの役に立ちません。私の Macbook Pro ラップトップでは、callable(True)ループあたり 119ns で 1000 回のクロックを実行しているのに対し、単純なTrueステートメントではループあたり 71ns です。したがって、単純な python オブジェクトの場合、callableテストにかかる時間はわずか 48ns です。nocall:一方、 を TALES ステートメントに追加するには、callable保存したばかりのテストの 48ns オーバーヘッドをほぼ確実に超える余分な処理が必要です。

nocall:したがって、パフォーマンスを向上させるために追加すると、逆効果になります。適切なキャッシングを実装する方がよいでしょう ( Varnish と組み合わせてplone.app.cachingを参照してください)。または、 Chameleonがユースケースで機能するかどうかを調べてください。

于 2011-04-01T15:26:00.197 に答える
0

すべての条件に当てはめないでください。それは傷つく可能性があります!特にあなたのコードに従わなければならない人々:-)

于 2012-02-10T12:26:54.297 に答える