为啥我的条件逻辑在 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>

即使bCat2True,也会返回&lt;div&gt;False&lt;/div&gt;。 谢谢, 安德鲁

【问题讨论】:

【参考方案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 中没有按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章

当 lhs 为假时,为啥在逻辑 AND 中评估条件(三元)运算符

为啥评论会影响我的文件的逻辑?

为啥我的 for 循环在“继续”之后没有重新评估条件?

为啥我的 If 语句在 PHP 中接受不正确的字符串条件?

为啥我的逻辑回归模型准确率达到 100%?

为啥我的 while 循环中的条件在 python 中不起作用?