0

想象一下这个场景:

我在 Zope 中有一个 ZPT,我在金属块中定义了一个全局变量。
这个变量从这样的表达式中获取它的值

global myVar id | nothing;
global anotherVar 1;

wherenothing可以替换为python:0or python:FalseorNone等​​等。

现在想象到另一个街区,我会做类似的事情

global myVar2 myVar | anotherVar | nothing;

nothing我上面指定的所有内容都在哪里。

现在假设它id没有一个值,因此myVar被采用nothing(或其他可能的值;它根本没有区别)。
我所期望的是,它myVar2具有anotherVar价值,因为anotherVar它具有价值。myVar2但令我大吃一惊的是,我注意到这不是真的,而且很有myVar价值。这意味着nothing

如果我理解发生了什么,我会假设这种语句只控制该变量的存在而不是它的值。

显然,我可以将这种陈述变成一种 Python 的方式,当然,它工作得“很好”(即,正如我所期望的那样)
所以,有人可以证实或反驳我在那里的假设吗?

4

1 回答 1

2

您要问的不是 Plone 或 Zope 特定的,您在这里处理的是TALES 语句,它与 TAL 和 METAL 一起构成了 Zope Page Templates 实现的页面模板语言(顺便说一下,还有以及其他几个实现用不同的编程语言)。

使用字符时使用的是 TALES 路径表达式|,它Pythonor表达式不同。表达式中命名的每个路径都将被解析,只有当它不存在时才会使用下一个路径。从规范:

评估 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>
于 2012-07-26T13:04:30.403 回答