gpt4 book ai didi

python - Python 请求中的 logging.NullHandler 和 __init__.py 文件位置

转载 作者:行者123 更新时间:2023-11-28 22:54:46 25 4
gpt4 key购买 nike

我正在尝试通过查看流行库中的代码来了解更多有关 Python 的知识。我接触的第一个图书馆是python-requests肯尼斯·赖茨 (Kenneth Reitz) 着。

我所做的只是git clone <request_repo_url_from_github> ,现在我正在检查代码。

我正在浏览 __init__.py文件在 requests/packages .

我有几个问题要问:

  1. 为什么是__init__.py里面requests/packages , 应该没有 __init__.py requests 下的文件直接地?还是因为这是一个直接从github上克隆卸载的包才这么简单?

  2. 第二个问题引用下面上面的代码。我想知道的是什么 NullHandler到底做什么?我看了一下文档 here ,拥有“无操作”处理程序意味着什么。图书馆开发人员会在哪里使用这个处理程序?我的意思是,它有什么特别之处?


import logging
try: # Python 2.7+
from logging import NullHandler
except ImportError:
class NullHandler(logging.Handler):
def emit(self, record):
pass

最佳答案

根据我对 requests 的内存,packages 目录包含其他依赖项的镜像,作者决定将这些依赖项与 requests 捆绑在一起,而不是添加为依赖项。就我个人而言,我会简单地使它们成为依赖关系,必要时引用特定版本,但我确信他们有采用捆绑方法的原因。无论如何,它包含一个 __init__.py 因此代码可以将其视为一个模块并执行如下操作:

import requests.packages.urllib3

如果您查看 requests directory on Github ,您会看到该目录中确实也有一个 __init__.py。如果你想要一个包的层次结构,你需要在每个级别都有这样的文件,尽管在最简单的情况下它可以是一个空文件。

如果您不将 __init__.py 放在目录中,Python 将不会将其识别为包 - 这是为了防止意外包含来自您不希望的位置的模块。您可以想象有多种方式可以将目录命名为与 sys.path 上其他地方的包相同的名称,并导致难以言喻的混淆,但由于不会有 __init__.py 在其中,它会被 Python 忽略。

要回答您的第二个问题,NullHandler 适用于出于某种原因使用日志记录处理程序很方便但您实际上不想进行任何日志记录的情况。如果您使用的是执行日志记录的库,则可能会使用它,但在您的情况下,您实际上并不想记录任何内容——您安装了一个 NullHandler 来丢弃这些日志消息,因为它有很多比更改他们的库以删除日志记录代码更容易(和更好的做法)。

在那个例子中,我想你可以添加一个替代日志记录并简单地设置日志记录级别,这样实际上就不会产生任何消息,但可以说使用 NullHandler 会更容易。

关于python - Python 请求中的 logging.NullHandler 和 __init__.py 文件位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17669999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com