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

问题描述 投票:-3回答:1

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

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

urlliburllib2是标准的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应该单独导入,如图所示的代码,还是应该从上述某个库中导入?

python python-3.x python-requests urllib urllib3
1个回答
3
投票

如果您使用的是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.requesturllib3包命名空间中的一个模块。 import request(没有s)不会导入它,因为它要求一个顶级名称。 import somethingelse.request也不会,因为那将是与urllib3不同的命名空间。仅仅因为名字requestsrequest相似并不意味着它们是同一个东西。 HTTP标准处理发送到服务器的请求的抽象概念,服务器返回响应,因此处理HTTP的不同项目中的名称通常会反映它们在代码中表示的概念。

这同样适用于名称urlliburllib2。曾几何时,Python开始使用urllib包,该包有限,后来在urllib2包中添加了扩展第一个并添加了更多功能。 Python 3整合了两个软件包,并将功能重新组织为series of new modules under the urllib namespaceurllib3包是一个independent project,为相同的功能构建一个更好的库。该项目的任何部分都没有合并到Python标准库中。

requests是一个项目,它为您提供干净,简单,易于使用的API来发出HTTP请求并处理结果响应。将它用于该API,不要担心实现细节。

© www.soinside.com 2019 - 2024. All rights reserved.