0

このシナリオを想像してみてください。

ZopeにZPTがあり、金属ブロックにグローバル変数を定義しています。
この変数は、次のような式から値を取得します

global myVar id | nothing;
global anotherVar 1;

どこでまたはまたはなどnothingに置き換えることができます。python:0python:FalseNone

今、別のブロックに、私は次のようなことをすることを想像してください

global myVar2 myVar | anotherVar | nothing;

nothing上で指定したすべてのものはどこにありますか。

idここで、それが値を持たず、そのようmyVarに取られたと仮定しますnothing(または他の可能な値。まったく違いはありません)。
私が期待したmyVar2のは、値があるanotherVarので、の値を取るanotherVarということでした。myVar2しかし、驚いたことに、これは真実ではなく、myVar価値があったことに気づきました。つまりnothing

何が起こっているのかを理解していれば、この種のステートメントはその変数の存在のみを制御し、その値は制御しないと思います。

明らかに、私はその種のステートメントをpythonicな方法で作成でき、もちろん、それは「うまく」機能します(つまり、私が期待したとおり)

4

1 に答える 1

2

あなたが求めているのはPloneやZopeに固有のものではなく、ここではTALESステートメントを扱っています。TALESステートメントは、TALおよびMETALとともに、Zopeページテンプレート(および、ちなみに、、およびその他のいくつかの実装)によって実装されるページテンプレート言語を形成します。さまざまなプログラミング言語で)。

|文字を使用するときにTALESパス式を使用していますが、これはPython式と同じではありません。or式で指定された各パスは解決され、存在しない場合にのみ次のパスが使用されます。仕様から:

TALESパス式が評価されると、成功するかパスがなくなるまで、各パスを左から右にトラバースしようとします。

すべてのパスは既存の変数名に解決されるため、それらはすべて存在し、値に関係なく最初のパスが使用されます。

python:代わりに式を使用します。

myVar2 python:myVar or anotherVar or None;

globalTALでは、キーワードが必要になることはめったにないことに注意してください。代わりに、ドキュメントのルート要素でこれらの項目を定義することをお勧めします。変数は、それらが定義されているXMLまたはHTML要素と同じスコープ内に表示されます。

<html tal:define="myVar id | nothing; anotherVar 1;">
  <!-- myVar and anotherVar are visible in the whole HTML document -->
</html>
于 2012-07-26T13:04:30.403 に答える