您可以创建一个 Jinja2 过滤器,它从当前上下文中获取宏,然后评估宏。过滤器是:
@contextfilter
def call_macro_by_name(context, macro_name, *args, **kwargs):
return context.vars[macro_name](*args, **kwargs)
如果您的应用程序需要,您可以在 context.vars 中查找宏之前对 macro_name 执行字符串操作。
这是一个完整的例子:
#!/usr/bin/env python
from jinja2 import Environment, contextfilter
@contextfilter
def call_macro_by_name(context, macro_name, *args, **kwargs):
return context.vars[macro_name](*args, **kwargs)
template_string = """\
{%- macro MyMacro(item) %}MyMacro({{ item }}){% endmacro -%}
{{ MyMacro('direct') }}
{{ 'MyMacro' | macro('indirect') }}
"""
env = Environment()
env.filters['macro'] = call_macro_by_name
template = env.from_string(template_string)
print(template.render())
哪个打印
MyMacro(direct)
MyMacro(indirect)