如果我们已经导入了urllib和urllib3,是否需要导入请求库以使用请求? -urllibx,要求混淆

时间:2018-11-04 14:09:19

标签: python python-3.x python-requests urllib urllib3

我需要使用“请求”和urllib3中的函数。在代码中
code importing requests and printing dir(urllib3)
您可以看到requests库正在被导入,但同时它是urllib3中的模块/包,它也已经被导入。

做一些研究,我发现Python带有urllib软件包,而request模块也有。另一方面,requestsurllib3内部的一个模块,但它本身是一个库。

urlliburllib2是标准的Python库,但urllib3是一个完全分离的库,名称混乱。它的一部分已包含在标准库中,requests依赖于它,但是它不是urllib / urllib2的较新版本;实际上要改进的库是httplib(参考:Github)。

”“在后台, requests 使用 urllib3 来完成大部分http繁重的工作。如果使用得当,除非您不注意,否则大部分内容应该相同需要更高级的配置”
(参考:Stackexchange):

我得出了这些结论,但我仍然感到困惑:如果我已经导入了urllib,是否还需要导入requests?如果我导入了urllib3怎么办?

还有,requests应该如所示的代码那样单独导入,还是应该从上述库之一导入?

1 个答案:

答案 0 :(得分:3)

如果您使用的是requests模块,那么这就是您唯一需要导入的内容。其余的工作由Python负责。 urllib3使用的requests实施细节,除非您需要访问urllib3库定义的特定对象,否则无需导入该对象进入您的代码库。

requestsurllib3内的一个模块,不是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.requesturllib3 namespace 中的一个模块。 import request(否s)将不会导入它,因为这需要顶级名称。 import somethingelse.request都不会,因为这将是与urllib3不同的名称空间。仅仅因为名称requestsrequest相似并不意味着它们是同一回事。 HTTP标准处理发送到服务器的请求的抽象概念,并且服务器返回 response ,因此处理HTTP的不同项目中的名称通常会反映该概念。它们以代码表示。

名称urlliburllib2的用法相同。以前,Python始于受限制的urllib程序包,后来又添加了urllib2程序包,从而扩展了第一个功能并添加了更多功能。 Python 3合并了这两个软件包,并将功能重组为series of new modules under the urllib namespaceurllib3软件包是independent project,用于为相同的功能构建更好的库。该项目的任何部分都没有合并到Python标准库中。

requests是一个项目,可为您提供干净,直接,易于使用的API,以发出HTTP请求并处理结果响应。将其用于该API,不必担心实现细节。