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   荣锋亮  阅读(34)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2023-03-26 hilla 2.0 发布
2022-03-26 minio 4*4 集群 故障测试
2022-03-26 nocodb minio 集成试用
2022-03-26 nocodb 核心入口依赖
2022-03-26 minio 纠删码测试
2021-03-26 使用外部db 加速dremio 查询
2021-03-26 开发一个cube.js cratedb driver

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示