想象一下这种情况:
我在Zope中有一个ZPT,我将其定义为一个金属块,一个全局变量 此变量从类似
的表达式中获取其值global myVar id | nothing;
global anotherVar 1;
其中nothing
可以替换为python:0
或python:False
或None
,依此类推。
现在想象一下,进入另一个街区,我会做类似
的事情global myVar2 myVar | anotherVar | nothing;
其中nothing
可以是我在上面指定的所有内容。
现在假设id
没有值,因此myVar
取nothing
(或其他可能的值;它根本没有区别)。
我期望myVar2
获取anotherVar
的值,因为anotherVar
具有值。但令我惊讶的是,我注意到这不是真的,myVar2
取myVar
值;这意味着nothing
。
如果我理解发生了什么,我会认为这种陈述只能控制该变量的存在而不是它的值。
显然,我可以将这种声明变成pythonic方式,当然,它的工作“很好”(即,正如我所料) 那么,有人可以证实或反驳我的想法吗?
答案 0 :(得分:2)
你所要求的不是Plone或Zope特定的,你在这里处理TALES statement,它与TAL和METAL一起形成Zope页面模板实现的页面模板语言(顺便说一句,也是chameleon,以及其他几种不同编程语言的实现。)
当您使用|
字符时,您正在使用TALES路径表达式,并且它不与Python or
表达式相同。表达式中命名的每个路径都将被解析,只有如果它不存在将使用下一个路径。从规范:
当评估TALES路径表达式时,它会尝试从左到右遍历每个路径,直到它成功或用完路径。
由于您的所有路径都解析为现有变量名称,因此它们都存在,并且将使用第一个路径,而不管它的值是什么。
您想要使用python:
表达式:
myVar2 python:myVar or anotherVar or None;
请注意,在TAL中,很少需要global
关键字。您可能希望在文档的根元素上定义这些项目;变量在与定义它们的XML或HTML元素相同的范围内可见:
<html tal:define="myVar id | nothing; anotherVar 1;">
<!-- myVar and anotherVar are visible in the whole HTML document -->
</html>