代码之家  ›  专栏  ›  技术社区  ›  AndreKR

一个印刷品表达奇怪地依赖于另一个印刷物表达

  •  0
  • AndreKR  · 技术社区  · 1 年前

    我有这个Jinja2模板:

    {% set input = 1 %}
    {% set steps = [1, 2, 3, 4]|select("greaterthan", input) %}
    {{ steps|list }}
    {{ steps|first if steps|list|length > 0 else None }}
    

    它打印:

    [2, 3, 4]
    None
    

    现在我删除 {{ steps|list }} .

    {% set input = 1 %}
    {% set steps = [1, 2, 3, 4]|select("greaterthan", input) %}
    {{ steps|first if steps|list|length > 0 else None }}
    

    它什么也没印。

    然后不是 {{步骤|列表}} 我把 {{ steps|first }} .

    {% set input = 1 %}
    {% set steps = [1, 2, 3, 4]|select("greaterthan", input) %}
    {{ steps|first }}
    {{ steps|first if steps|list|length > 0 else None }}
    

    现在它打印:

    2
    

    有什么问题 {{ steps|first if steps|list|length > 0 else None }} 根据我打印的其他内容,它的行为会有所不同?

    1 回复  |  直到 1 年前
        1
  •  0
  •   sytech    1 年前

    {% set steps = [1, 2, 3, 4]|select("greaterthan", input) %} 就像一个生成器表达式,基本上与Python代码相同,如下所示:

    steps = (select("greaterthan", item) for item in [1,2,3,4])
    

    也就是说, steps 是一个发电机,您只能从中拉出 下一个 值,直到值用完为止。所以,当你这样做的时候 {{ steps|list }} 在任何时候,您都会耗尽生成器,并且无法迭代 台阶 变量。

    因此,在你的jinja代码中发生的事情的翻译可以大致如下所示:

    >>> print(list(steps))  # exhausts the generator
    [2, 3, 4]
    >>> print(list(steps))  # no more values in the generator
    []
    >>> print(len(list(steps))
    0
    

    您可能想做的是首先将生成器排成一个列表,然后分配 那个 变量的值 台阶 .

    我想这个的jinja语法只是添加 |list :

    {% set steps = [1, 2, 3, 4]|select("greaterthan", input)|list %}