Python请求中的logging.NullHandler和_init__;upy.py文件位置
我试图通过查看流行库中的代码来了解更多关于Python的知识。我提到的第一个库是Kenneth Reitz的Python请求中的logging.NullHandler和_init__;upy.py文件位置,python,python-2.7,python-requests,Python,Python 2.7,Python Requests,我试图通过查看流行库中的代码来了解更多关于Python的知识。我提到的第一个库是Kenneth Reitz的python请求 我所做的只是git clone,现在我正在检查代码 我正在查看请求/包中的\uu init\uuuuuuuuuupy文件 我有几个问题要问: 为什么\uuuu init\uuuuuuuuuupy在请求/包中,而请求下不直接有一个\uuuuuuuuuuuuuuuuuuuuuuuuupy文件?或者是因为这是一个直接从github克隆并卸载的包,所以很简单吗 第二个问题涉及以下
python请求
我所做的只是git clone
,现在我正在检查代码
我正在查看请求/包
中的\uu init\uuuuuuuuuupy
文件
我有几个问题要问:
为什么\uuuu init\uuuuuuuuuupy
在请求/包
中,而请求
下不直接有一个\uuuuuuuuuuuuuuuuuuuuuuuuupy
文件?或者是因为这是一个直接从github克隆并卸载的包,所以很简单吗
第二个问题涉及以下上述代码。我想知道的是NullHandler
到底做了什么?我看了一下文档,有一个“无操作”处理程序意味着什么。库开发人员在哪里使用这个处理程序?我是说,它有什么特别之处
在一个目录中有一个\uuuuu init\uuuuuu.py
文件会将该目录变成一个Python包。它也不会将子目录转换为包。如果您查看源代码树,您将看到它是这样的(删除了不相关的文件)
这定义了一个顶级包,请求
,以及子包请求.packages
,请求.packages.charade
和请求.packages.urllib3
。定义这些包对于使它们能够正确导入是必要的
要直接回答您提出的问题,直接在请求/
下有一个初始化.py
文件。整棵树上不止一棵
NullHandler
不执行任何操作。它的存在使得对logging
库的调用可以无条件地使用,即使用户没有配置任何记录器。基本上,当urllib3
尝试记录任何内容时,所有连接到日志库的记录器都会被调用。如果未连接任何记录器,则日志库将发出警告。这些都很糟糕,因此这是一个解决方案,可以在不强制登录用户的情况下简化库代码
在一个目录中有一个\uuuuu init\uuuuuu.py
文件会将该目录变成一个Python包。它也不会将子目录转换为包。如果您查看源代码树,您将看到它是这样的(删除了不相关的文件)
这定义了一个顶级包,请求
,以及子包请求.packages
,请求.packages.charade
和请求.packages.urllib3
。定义这些包对于使它们能够正确导入是必要的
要直接回答您提出的问题,直接在请求/
下有一个初始化.py
文件。整棵树上不止一棵
NullHandler
不执行任何操作。它的存在使得对logging
库的调用可以无条件地使用,即使用户没有配置任何记录器。基本上,当urllib3
尝试记录任何内容时,所有连接到日志库的记录器都会被调用。如果未连接任何记录器,则日志库将发出警告。这些都很糟糕,因此这是一个解决方案,可以在不强制登录用户的情况下简化库代码
根据我对请求
的记忆,包
目录包含其他依赖项的镜像,作者决定将这些镜像与请求
捆绑在一起,而不是作为依赖项添加。就我个人而言,我会简单地让他们依赖,如果必要的话引用一个特定的版本,但我相信他们使用捆绑方法是有原因的。在任何情况下,它都包含一个\uuuu init\uuuu.py
,因此代码可以将其视为一个模块,并执行如下操作:
import requests.packages.urllib3
如果您查看,您将看到在该目录中也确实有一个\uuuu init\uuuuuu.py
。如果您想要有一个包的层次结构,您需要在每个级别上都有这样一个文件,尽管在最简单的情况下,它可以是一个空文件
如果不将\uuuu init\uuuu.py
放在目录中,Python将不会将其识别为包-这是为了防止意外地将模块包含在您不希望包含的位置。您可以想象有很多种方法可以将目录命名为与sys.path
上其他地方的包相同的名称,并导致无法描述的混乱,但是由于其中不会有\uuuuu init\uuuuuuuuuuupy
,因此Python将忽略它
为了回答您的第二个问题,NullHandler
适用于出于某种原因方便使用日志处理程序,但实际上不想进行任何日志记录的情况。如果您使用的是一个执行日志记录的库,但在您的情况下,您实际上不想记录任何东西,那么您可以使用它—您可以安装一个NullHandler
来丢弃这些日志记录消息,因为这比更改它们的库以去除日志记录代码要容易得多(而且是更好的做法)
在这个例子中,我假设您可以添加一个替代日志记录,并简单地设置日志记录级别,这样实际上就不会生成任何消息,但可以说,只使用NullHandler
更容易,packages
目录包含其他依赖项的镜像,作者决定将这些镜像与请求捆绑在一起,而不是作为依赖项添加。就我个人而言,我会简单地让他们依赖,如果必要的话引用一个特定的版本,但我相信他们使用捆绑方法是有原因的。在任何情况下,它都包含一个\uuuu init\uuuu.py
,因此代码可以将其视为一个模块,并执行如下操作:
import requests.packages.urllib3
如果您查看,您将看到确实存在一个\uu ini
import requests.packages.urllib3