我需要使用来自urllib3
的'requests'和函数。在代码中
您可以看到正在导入requests
库,但同时它是urllib3
中的模块/包,它也已导入。
做了一些研究我发现Python附带了urllib
软件包,它带有request
模块。另一方面,requests
是urllib3
中的一个模块,但它本身就是一个库。
urllib
和urllib2
是标准的Python库,但是urllib3
是一个完全分离的库,名称令人困惑。其中一部分已包含在标准库中,requests
依赖于它,但它不是urllib
/ urllib2
的较新版本;实际上想改进的图书馆是httplib
(参考:Github)。
"Under the hood, requests uses urllib3 to do most of the http heavy lifting. When used properly, it should be mostly the same unless you need more advanced configuration"(ref: Stackexchange):
我得出了这些结论,但我仍然感到困惑:如果我已经导入了urllib
,我还需要导入requests
吗?如果我进口了urllib3
怎么办?
另外,requests
应该单独导入,如图所示的代码,还是应该从上述某个库中导入?
如果您使用的是requests
模块,那么这是您需要导入的唯一内容。其余的由Python来处理。 urllib3
使用requests
是一个实现细节,除非你需要访问urllib3
库定义的特定对象,你不需要将它导入你的代码库。
requests
不是urllib3
内的一个模块。 urllib3
模块定义了一个urllib3.request
(单数!)模块,它与requests
包完全不同:
>>> import urllib3
>>> import requests
>>> urllib3.request
<module 'urllib3.request' from '/Users/mj/Development/venvs/stackoverflow-latest/lib/python3.7/site-packages/urllib3/request.py'>
>>> requests
<module 'requests' from '/Users/mj/Development/venvs/stackoverflow-latest/lib/python3.7/site-packages/requests/__init__.py'>
>>> requests is urllib3.request
False
请注意,urllib3.request
是urllib3
包命名空间中的一个模块。 import request
(没有s
)不会导入它,因为它要求一个顶级名称。 import somethingelse.request
也不会,因为那将是与urllib3
不同的命名空间。仅仅因为名字requests
和request
相似并不意味着它们是同一个东西。 HTTP标准处理发送到服务器的请求的抽象概念,服务器返回响应,因此处理HTTP的不同项目中的名称通常会反映它们在代码中表示的概念。
这同样适用于名称urllib
和urllib2
。曾几何时,Python开始使用urllib
包,该包有限,后来在urllib2
包中添加了扩展第一个并添加了更多功能。 Python 3整合了两个软件包,并将功能重新组织为series of new modules under the urllib
namespace。 urllib3
包是一个independent project,为相同的功能构建一个更好的库。该项目的任何部分都没有合并到Python标准库中。
requests
是一个项目,它为您提供干净,简单,易于使用的API来发出HTTP请求并处理结果响应。将它用于该API,不要担心实现细节。