jinja2 通过Template. make_module 进行动态macro 创建以及macro 方法调用

实际属于一个小技巧,可以实现比较灵活的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/

posted on 2024-03-26 15:27  荣锋亮  阅读(3)  评论(0编辑  收藏  举报

导航