[Zope-CMF] Re: TAL: Semantics of the | operator inside tal:condition

Tres Seaver tseaver at zope.com
Sun Jan 18 16:41:27 EST 2004


Andreas Jung wrote:
> While debugging a problem in Plone 2 I came across some code that
> uses tal:condition="expr1|expr2"  that was never executed  if expr1
> evaluated to False. Here is a small example that show the problem
> 
> <div tal:define="a python: []; b python: [1,2,3]">
>  <span tal:condition="a|b">
>    hello world
>  </span>
> </div>
> 
> Running the template outputs nothing instead of 'hello world'
> 
> Is there a reasonable explanation for this?
> 
> Also look at this code here:
> 
> <div tal:define="a python: None; b python: 42; c a|b">
> <span tal:content="c" />
> </div>
> 
> One would expect that 'c' is assigned to 42. At least this was the opinion
> of some qualified plone developers. The TAL documentation is not completely
> clear at this point. I know that the code can be rewritten using test()
> but I would like to know about the semantics of the | operator in this 
> case.

See the "Alternate Paths" section of the "Advanced ZPT chapter of the 
Zope Boot",
   http://zope.org/Documentation/Books/ZopeBook/2_6Edition/AdvZPT.stx

The '|' operator in path expressions is not a "logical or";  it is a 
"fallback or".  The second clause is only tested if the first raises one 
of a set of exceptions (NameError, AttributeError, TypeError, 
IndexError, I think;  check the source to be sure);  such exceptions 
indicate that the first clause couldn't be evaluated.

You want to use a Python expression to get "logical or" semantics".

Tres.
-- 
===============================================================
Tres Seaver                                tseaver at zope.com
Zope Corporation      "Zope Dealers"       http://www.zope.com




More information about the Zope-CMF mailing list