python中Template的使用总结

今天在python写代码实现request的封装时,遇到两个问题,一个是字典的使用方式不同,带来的效果完全不同的结果
# self.d[“cookies”] = self.__argument[“cookies”] d是一个字典对象
self.d = {“cookies”: self.__argument[“cookies”]}
第一个语句是往字典里面添加一个键值对,不改变已有的键值对内容的情况下,直接添加一个键值对,这个写法和self.d.update(dict)达到相同的结果
第二个语句则是直接新增一个键值对的字典对象,把它内存地址赋值给已有的变量d,d变量以前的对象内容将无法访问和查看

Template的问题

我们再用代码去替换一个正常的json字符串(json.dumps(self.d)转换dict为str对象),此处的self.__argument内部保存有cookie的键值对,代码语句如下:

self.d = json.loads(Template(json.dumps(self.d)).substitute(**self.__argument))

执行报错,一直不明白为啥报错:
Let the base class default method raise the TypeError
return JSONEncoder.default(self, o)
raise TypeError(f’Object of type {o.class.name} ’
f’is not JSON serializable’)
TypeError: Object of type RequestsCookieJar is not JSON serializable

然后就启用了调试模式,发现self.__argument内部的变量中带有嵌套的字典项,所以才无法执行Template的对象
如下图:
替换的参数
调试模式下看到的cookie值内容
然后,优化了一下代码结构,判断一下self.__argument字典对象是否有cookie,再决定是否执行替换:

if self.__argument.get("cookies",False):   
    pass
else:
    self.d = json.loads(Template(json.dumps(self.d)).substitute(**self.__argument))

这样就兼容了需要配置cookie方式的http请求,下次就不会报错了
总结:
以前以为Template().substitute()方法的参数值只要是字典对象就行,
**
1、嵌套的字典对象(key-value,value不是单纯的Str)是无法正常调用substitute()的,而我们request请求返回的response对象中,response.cookies就不是单纯的一个字符串,而是一个RequestsCookiesJar的对象,所以放到把它放到substitute()方法的参数中,就会报错
2、substitute()内部的替换必须传入不定长的字典对象的值,而不是字典变量,substitute(self.__argument) 不能写成substitute(self.__argument)
3、就算self.__argument是一个{}空字典项也可以正常调用substitute()方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值