import requests
response = requests.get('http://httpbin.org/get')
print vars(response) # no response.text listed
print response.text # value printed
为什么vars(response)
在该值存在时未列出response.text
?
dir(response)
会列出response.text
,但不会打印它的值。
答案 0 :(得分:2)
对于第一个问题,text
中未显示vars
的原因是because it's a property(由@property
定义),而不是类属性(这是最终由__dict__
所示的vars
中的内容。
对于第二个问题,这是因为dir
和vars
的工作方式。
来自vars
的文档:
vars([object])
返回模块,类,实例或任何内容的 dict 属性 具有 dict 属性的其他对象。
模块和实例等对象具有可更新的 dict 属性;但是,其他对象可能会对其进行写入限制 dict 属性(例如,新式类使用dictproxy来阻止直接字典更新)。
没有参数,vars()就像locals()一样。请注意,当地人 字典仅对本地的更新有用 字典被忽略了。
对于dir
:
默认的dir()机制对不同类型的行为有所不同 对象,因为它试图产生最相关的,而不是 完整,信息:
如果对象是模块对象,则列表包含的名称 模块的属性。如果对象是类型或类对象,则列表 包含其属性的名称,并递归地包含 其基础的属性。否则,列表包含对象的 属性的名称,类的属性名称和 递归地类的基类的属性。
所以基本上dir
只打印出传入参数的属性,不其对应的值。
此外,this answer在解释差异方面非常全面。
答案 1 :(得分:1)
它不在vars
结果中,因为vars
不会将属性解析为对象的父类。见this other thread on SO。
您可以通过在对象上使用dir
来请求所有“属性,其类的属性以及递归其类的基类的属性”:
In [1]: import requests
In [2]: response = requests.get('http://httpbin.org/get')
In [3]: 'text' in vars(response)
Out[3]: False
In [4]: 'text' in dir(response)
Out[4]: True