实际属于一个小技巧,可以实现比较灵活的jinja2 扩展,是从dbt 对于macro 的处理部分学习到的
参考代码
- app.py
from jinja2 import Environment
env = Environment()
# 定义macro 的内容
macro_template = """
{% macro mydemo(name, age) -%}
{{name}} -----{{age}}
{%- endmacro %}
"""
# 通过string 模式的模版加载
template = env.from_string(macro_template)
context = None
# template.make_module 创建模块
module = template.make_module(vars=context, shared=False)
# module 会包含一个macro 名称的属性(是一个方法)
macro_func = module.__dict__['mydemo']
# 调用方法
info = macro_func('zhangsan', 18)
print(info)
说明
以上技巧在dbt 中的用途还是比较大的,是一个值得使用的小技巧
参考资料
https://jinja.palletsprojects.com/en/3.0.x/api/#high-level-api
https://jinja.palletsprojects.com/en/3.1.x/templates/