我正在使用 Python“请求”模块请求 HTTP API。
result = requests.get(api_url)
响应采用 JSON 格式,并包含一个字典形式的“数据”键。
出于某些原因,我必须在脚本中进一步提出第二个请求,并且我正在尝试用第二个(result.json['data']
)更新第一个字典(result2.json['data']
)。
我试过这个:
result.json['data'].update(result2.json['data'])
还有这个:
for key,value in dict(result2.json['data']).iteritems():
result.json['data'][key] = value
但这些都不起作用,最后的 result.json['data']
未修改,仅包含前几项。
所以我想知道 Python“请求”模块是否生成了一些“只读”对象之王,或者我是否只是遗漏了一些东西。
最佳答案
result.json()
是一个方法(请求 1.0 及更高版本)或一个属性。将该方法或属性的结果存储在一个变量中,然后更新它:
json_result = result.json()
# requests < 1.0: json_result = result.json
json_result['data'].update(result2.json()['data'])
(在旧的 requests
版本(pre-1.0)中,result.json
是一个 property,在它下面仍然是一个方法返回你的对象在飞行中)。
否则,Response
对象不应该是可变的。您必须更改响应 正文 才能更改 result.json
返回的内容,并且需要深入了解 Response
对象的方式缓存响应主体以更改它。这会将您绑定(bind)到特定的 requests
版本。
对于 current requests
系列 (2.4.x),您可以换出 response._content
属性:
result.encoding, result._content = 'utf8', json.dumps(json_result)
我假设 result.content
已经存在(例如,流响应已经被消费),并且 json_result
已经更新。
这是否适用于其他 requests
版本取决于; _content
是内部私有(private)属性。前导下划线表示它不是公共(public) API 的一部分,因此开发人员可以自由更改该属性的含义或在未来的版本中将其完全删除。
关于python - 修改一个 Python "requests"模块响应对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26342180/