python标准库Template字符串模版序列化器
Python标准库Template字符串模版序列化器
今天有一个需求,就是运营同学通过模版配置好字符串,然后希望可以导表渲染成指定的样式。有点类似jinjia,或者django的模版引擎。乍一想,觉得这个功能应该不难。
需求内容:
模版: 我是xxx,我今年xx岁,我的爱好是:xxxxx
同时提供一个excel文档,希望能将excel文档的指定行列渲染出来,生成内容。
我接到以后开搞后发现了下面几个问题
1、貌似jinja2是生成html的,我们不需要html,反而需要的是一些特殊自定义的一些标签样式,这个想深入解决还比较难;
2、为了一个渲染工具,搭建一个django貌似也有点杀鸡用牛刀了,同时我们在不同的网段,最好是后期打包成工具给他们最靠谱;
3、除此之外我找到了一个rich的库,深入了解,发现也不是和我得需求太吻合;
解决方案
返璞归真,第三方库没有合适的,那就自己来搞看看。结果还就真在string下面找到了Template这个方法。
看源码,官方说的比较简单,就是用于支持$替换的字符串类。
在实际用下来,我发现我的需求核心代码竟然只要2行。 我真的没有骗人,不信你自己看
from string import Template
def render_template(tmp,*args)->str:
"""
模版渲染,根据传入的参数进行动态渲染
"""
tmp_obj = Template(tmp)
return tmp_obj.substitute(args[0])
查看源码,其实主要也就 substitute、safe_substitute 、 is_valid、get_identifiers 这几个方法,而我得需求只要substitute 取代方法就可以了。
substitute
简单理解就是把字符串里面的参数换成我们的变量值。
str = '我是${name},我今年${age}岁,我的爱好是:${like}'
print(Template(str).substitute({'name':'佩恩','age':'22','like':'吃饭、睡觉'}))
>>> 我是佩恩,我今年22岁,我的爱好是:吃饭、睡觉
没错,就是这么简单,只要使用${}框起来的变量就可以替换了。但是如果字符串的某个$变量不存在就会报错。这里就引出了下一个方法safe_substitute
safe_substitute
看了一下源码,也很简单,提供了一个类似映射的机制,没有的就不渲染直接当字符串输出了。
str = '我是${name},我今年${age}岁,我的爱好是:${like}'
print(Template(str).substitute({'name':'佩恩','age':'22'}))
>>> 我是佩恩,我今年22岁,我的爱好是:${like}
重点就是$var变量要与substitute字典参数中的key一致,能对应上
is_valid
检查方法,如果占位符出错,会抛出错误告诉你 具体哪里的占位符出错或者没有识别
get_identifiers
感觉对我用户不大,获取一个标识符的,我看了一下代码,大致就是传递的参数需要包含指定的字段验证才可以。