python + jinja2反疯狂

时间:2014-10-24 00:17:45

标签: python jinja2

我有这个超级愚蠢的代码:

{% set count = 0 %}
{% for key in 'foo', 'bar': %}
    {% for x in 'a', 'b': %}
        {{count}}
        {% set count = count + 1 %}
    {% endfor %}
{% endfor %}

我得到的是" 0 1 0 1"而不是" 0 1 2 3"。

为什么?!

3 个答案:

答案 0 :(得分:3)

这是一种hacky解决方案(这是基于这个答案:Jinja2: Change the value of a variable inside a loop):

{% set count = {'value': 0} %}
{% for key in 'foo', 'bar': %}
    {% for x in 'a', 'b': %}
        {{count.value}}
        {% if count.update({'value': (count.value + 1)}) %} {% endif %}
    {% endfor %}
{% endfor %}

您的代码中发生的事情是set是一个赋值运算符。由于您在嵌套循环中调用set,因此嵌套循环中的计数是一个不同的变量。

因此,为了解决这个问题,你可以使用我所链接的答案中所示的字典。

接下来,你需要再做一次黑客攻击,即使用空的if语句来更新dict。您不能只执行以下操作,因为它会导致jinja语法错误:

{% count.update({'value': (count.value + 1)}) %}

另一个选择是创建自己的jinja函数,然后你可以做这样的事情:

{% set count = {'value': 0} %}
{% for key in 'foo', 'bar': %}
    {% for x in 'a', 'b': %}
        {{count.value}}
        {{ increment_count(count) }}
    {% endfor %}
{% endfor %}

在这里,我创建了一个名为increment_count的函数:

def increment_count(count):
    count['value'] += 1
    return ''

计数返回一个空字符串,因此我们不必使用空的if语句。我通常使用带有Jinja的Flask。使用Flask,您可以使用上下文处理器添加功能:http://flask.pocoo.org/docs/0.10/templating/#context-processors

答案 1 :(得分:0)

我认为这更干净:

{% set count = [] %}
{% for key in 'foo', 'bar': %}
    {% for x in 'a', 'b': %}
        {{count|length}}
        {% set var = count.append(1) %}
    {% endfor %}
{% endfor %}

答案 2 :(得分:-2)

我不确定这是否是Python。但它被标记为pythonic问题。如果你用Python编写这个函数。您将获得所需的输出。

count= 0
l=[]
for key in "foo", "bar":
  for x in 'a','b':
    l+=[count]
    count+=1
print l

输出:[0,1,2,3]