今天在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的对象
如下图:
然后,优化了一下代码结构,判断一下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()方法