1.摘要

我找不到,像if any() in object/if all() in object这样的表达式在JJIA2中的正确语法是什么.

2.MCVE

  • Live demo on Repl.it:

    """Jinja2 if any() in object MCVE."""
    from jinja2 import Template
    
    KIRA_BLOCK = """
    {% if 14 in range(1,5) or 4 in range(1,5) or 7 in range(1,5) %}
        Kira Goddess!
    {% endif %}
    """
    
    print(Template(KIRA_BLOCK).render())
    
    

如何才能在没有重复代码的情况下获得相同的结果?

3.无能为力

  1. 我试着在谷歌、GitHub和Jinja documentation上搜索我的问题的答案和类似的例子

  2. 我不知道怎么用Jinja built-in filters来解决我的问题

  3. 我试了select()滤镜,就像this answer on Stack Overflow中推荐的那样.就像这样:

    KIRA_BLOCK = """
    {% if (14,4,7)|select|first in range(1,5) %}
        Kira Goddess!
    {% endif %}
    """
    
  4. 我try 注册一个自定义的any()过滤器,就像在Stack Overflow上的同一个答案中所建议的那样.就像这样:

    """Jinja2 if any() in object MCVE."""
    from jinja2 import Environment
    from jinja2 import Template
    
    
    environment = Environment()
    
    environment.filters["any"] = any
    
    KIRA_BLOCK = """
    {% if (14,4,7)|any in range(1,5) %}
        Kira Goddess!
    {% endif %}
    """
    
    
    print(Template(KIRA_BLOCK).render())
    
    

4.真实例子

预防XY problem:

我在静态站点生成器Pelican中使用类似的模板.示例:

{# [INFO] If any of the classes "attention", "caution" or "warning" exists in my article, I add specific styles #}
{% if "class=\"attenion\"" in article.content or if "class=\"caution\"" in article.content or if "class=\"warning\"" in article.content %}
    <link rel="preload" href="path/to/css/third-party/Admonition/admonition-warning.min.css" as="style" onload="this.rel='stylesheet'">

{# [INFO] Elif all classes "faq", "help" and "question" exists in my article, I add another styles #}
{% elif "class=\"faq\"" in article.content and if "class=\"help\"" in article.content and if "class=\"question\"" in article.content %}
    <link rel="preload" href="path/to/css/third-party/Admonition/admonition-question.min.css" as="style" onload="this.rel='stylesheet'">
{% endif %}

我不明白如何从这些模板中删除硬编码.

谢谢.

推荐答案

我找不到,像if any() in object/if any() in object这样的表达式在JJIA2中的正确语法是什么?

这不是any()函数在Python中的工作方式.您可能会写成这样:

if any(value == 4 for value in mylist):
    ...

any()函数,如the documentation所示,相当于:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

不幸的是,上面的内容不能很好地翻译成JJJA,因为JJJA不支持列表/元组的理解,如果没有列表/元组的理解,any()函数就没有那么有用了.


看看你真正想做的是什么:

{#
   [INFO] If any of the classes "attention", "caution" or
  "warning" exists in my article, I add specific styles
#}
{% if "class=\"attenion\"" in article.content
     or if "class=\"caution\"" in article.content 
      or if "class=\"warning\"" in article.content %}
    <link rel="preload" href="path/to/css/third-party/Admonition/admonition-warning.min.css" as="style" onload="this.rel='stylesheet'">
{% endif %}

您可以注册如下所示的自定义has_class筛选器:

def has_class(content, classnames):
    return any(f'class="{name}"' in content for name in classnames)

并像这样使用它:

{#
   [INFO] If any of the classes "attention", "caution" or
  "warning" exists in my article, I add specific styles
#}
{% if article.content|has_class(['attention', 'caution', 'warning']) %}
    <link rel="preload" href="path/to/css/third-party/Admonition/admonition-warning.min.css" as="style" onload="this.rel='stylesheet'">
{% endif %}

Python相关问答推荐

Asyncio与队列的多处理通信-仅运行一个协程

日程优化问题不知道更好的方式来呈现解决方案- Python / Gekko

尽管进程输出错误消息,subProcess.check_call的CalledProcess错误.stderr为无

Pandas read_jsonfuture 警告:解析字符串时,to_datetime与单位的行为已被反对

KNN分类器中的GridSearchCV

code _tkinter. Tcl错误:窗口路径名称错误.!按钮4"

是pandas.DataFrame使用方法查询后仍然排序吗?

从管道将Python应用程序部署到Azure Web应用程序,不包括需求包

在应用循环中间保存pandas DataFrame

如何使用没有Selenium的Python在百思买着陆页面上处理国家/地区 Select ?

提取两行之间的标题的常规表达

如何在BeautifulSoup中链接Find()方法并处理无?

从numpy数组和参数创建收件箱

管道冻结和管道卸载

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

多指标不同顺序串联大Pandas 模型

Python逻辑操作作为Pandas中的条件

如何在turtle中不使用write()来绘制填充字母(例如OEG)

在嵌套span下的span中擦除信息

从Windows Python脚本在WSL上运行Linux应用程序