正在进入ing...

python标准库Template字符串模版序列化器

发布时间:2023-08-08 浏览量: 926 文章分类: python

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])

查看源码,其实主要也就 substitutesafe_substituteis_validget_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

感觉对我用户不大,获取一个标识符的,我看了一下代码,大致就是传递的参数需要包含指定的字段验证才可以。