template替换子目录部分过程时,当变量的值是空字符串时,更换变量后会变成None

    def template(path, data, sub=None):
        """
        :param path: 输入yml文件路径
        :param data: 需要更换的模板变量
        :param sub: 是对yml数据的二次提取,获取某个嵌套字典中的变量值替换,可以有多个接口数据替换
        :return: 返回替换变量后的模板数据
        """

        with open(path, encoding='utf-8') as f:
            if sub is None:
                # yaml.safe_load把yml格式的字符串变成dict类型返回
                return yaml.safe_load(Template(f.read()).substitute(data))

            else:
                # 由于Template需要替换全部的变量,有漏的就会报错,先写Template(f.read()).substitute(data),先把文件的中想要转换的yml数据转换为字典,在导出为yml格式
                data = Template(yaml.safe_dump(yaml.safe_load(f)[sub])).substitute(data)
                return yaml.safe_load(data)

yml模板

create:
  "method": "post"
  "url": "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_corp_tag?"
  "params": "access_token=$token"
  "json":
    "group_id": "etMCs1DwAAg_jBNAug"
    "tag":
      - "name": "$name"

过程:当name=""时,最后返回结果会变成None,期望的返回空字符串

datas = {"token": "212134", "name": ""}
a = template('text.yml', datas,"create")

结果:

{'json': {'group_id': 'etMCs1DwAAg_jBNAuvGR3B21cwl4o0jg', 'tag': [{'name': None}]}, 'method': 'post', 'params': 'access_token=212134', 'url': 'https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_corp_tag?'}

怎么解决

用string.Template替换它会把空字符换成None,要解决的话可以使用一个空字符标识,先替换成特殊字符,在template后再替换成空字符。

这边建议直接使用这样的替换方法

from jinja2 import Template

def template_replace(template_str, data):
    template = Template(template_str)
    result = template.render(data)
    return result

template_str = "{'json': {'group_id': 'etMCs1DwAAg_jBNAug', 'tag': [{'name': {{name}}]}, 'method': 'post', 'params': 'access_token={{token}}', 'url': 'https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_corp_tag?'}"
data = {"token": "123124141", "name": ""}
output = template_replace(template_str, data)
print(output)