为啥我的条件逻辑在 Jinja2/CherryPy 中没有按预期工作?
Posted
技术标签:
【中文标题】为啥我的条件逻辑在 Jinja2/CherryPy 中没有按预期工作?【英文标题】:Why doesn't my condition logic work as expected in Jinja2/CherryPy?为什么我的条件逻辑在 Jinja2/CherryPy 中没有按预期工作? 【发布时间】:2012-01-16 00:50:03 【问题描述】:% if bCat2 == True %
<div>True</div>
% else %
<div>False</div>
即使bCat2
是True
,也会返回<div>False</div>
。
谢谢,
安德鲁
【问题讨论】:
【参考方案1】:这部分文档可以帮助您:
特殊常量 true、false 和 none 确实是小写的。 因为这在过去引起了混乱,所以当写 True 扩展 到一个被认为是假的未定义变量,所有三个 也可以写成标题大小写(True、False 和 None)。然而对于 一致性(所有 Jinja 标识符都是小写的)你应该使用 小写版本。
来源:http://jinja.pocoo.org/docs/templates/
试试那个代码:
% if bCat2 == true %
<div>True</div>
% else %
<div>False</div>
% endif %
【讨论】:
这应该是正确的答案。如果列表很大并且我们希望将大列表发送到模板,则迭代一个大列表并将每个布尔值更改为字符串可能会变得昂贵。 奇怪的是这对我不起作用...有更新吗? 目前距离 Python 太远,无法更新。【参考方案2】:选项 1:最常见的解决方案
像 python 一样解决这个问题。
检查变量是否为真
% if bCat2 %
<div>True</div>
% else %
<div>False</div>
检查变量是否为假
% if not bCat2 %
<div>False</div>
% else %
<div>True</div>
Jinja2 If documentation
选项 2:Jinja2 与解决方案相同
像 jinja2 一样解决问题。 小心使用小写布尔值。
检查变量是否为真
% if bCat2 is sameas true %
<div>True</div>
% endif %
检查变量是否为假
% if bCat2 is sameas false %
<div>False</div>
% endif %
Jinja2 sameas documentation
【讨论】:
对于那些对此感到困惑的人:当您将布尔变量放入 --extra-vars(of ansible-playbook) 时,不要这样做:--extra-vars="bCat2=True"
。这是行不通的,因为命令行应用程序生成了一个字符串类型的 bCat2 var。最好在这里使用 json:--extra-vars=' "bCat2": true '
.
或者你可以给 var 一个空的 val,这将被解释为 false。像这样:--extra-vars='bCat2='
【参考方案3】:
在 Jinja2 中执行此操作的正确方法是:
% if bCat2 is sameas true %
<div>True</div>
% elif bCat2 is sameas false %
<div>False</div>
% endif %
你做不到的原因
% if bCat2 == true %
如果 bCat2 == 1 或 bCat2 == 1.0 它也将被认为是 True。
【讨论】:
【参考方案4】:要测试模板中的布尔变量,请将其转换为 Python 中的字符串
str(bCat2)
然后将其与模板中的字符串进行比较
% if bCat2 == 'True' %
<div>True</div>
% else %
<div>False</div>
【讨论】:
但是最好直接在 Jinja2 中比较,不用将布尔值转换为字符串,而不是 @Andrew?我认为@mrroot5 答案将是测试布尔值是真还是假的更容易和更好的方法。只是出于好奇,为什么有人要倾向于您提出的解决方案?【参考方案5】:我想补充一点,如果您的逻辑有点复杂,您可能需要了解范围。
如official documentation中所述:
从 2.10 版开始,可以使用以下方式处理更复杂的用例 允许跨范围传播更改的命名空间对象:
% set ns = namespace(found=false) %
% for item in items %
% if item.check_something() %
% set ns.found = true %
% endif %
* item.title
% endfor %
Found item having something: ns.found
【讨论】:
【参考方案6】:拿这个:
% if bCat2 is true %
<div>True</div>
% else %
<div>False</div>
% endif %
我的测试:
$ python -m pip install j2cli
$ j2 <(echo "% if false is true %
<div>True</div>
% else %
<div>False</div>
% endif %")
<div>False</div>
$ j2 <(echo "% if true is true %
<div>True</div>
% else %
<div>False</div>
% endif %")
<div>True</div>
【讨论】:
以上是关于为啥我的条件逻辑在 Jinja2/CherryPy 中没有按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章