首页 > 解决方案 > Python 日志记录 - 了解 _nameToLevel 和 _levelToName 以及在编辑器中导入与 REPL

问题描述

我正在尝试了解日志记录中可用的用法_nameToLevel_levelToName方法。我尝试使用文档(https://docs.python.org/3.8/library/logging.html)阅读,但实际上并没有找到任何好的示例信息。

下一次尝试是通过深入了解logging.__init__.py

RITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

_levelToName = {
    CRITICAL: 'CRITICAL',
    ERROR: 'ERROR',
    WARNING: 'WARNING',
    INFO: 'INFO',
    DEBUG: 'DEBUG',
    NOTSET: 'NOTSET',
}
_nameToLevel = {
    'CRITICAL': CRITICAL,
    'FATAL': FATAL,
    'ERROR': ERROR,
    'WARN': WARNING,
    'WARNING': WARNING,
    'INFO': INFO,
    'DEBUG': DEBUG,
    'NOTSET': NOTSET,
}

由于使用下划线,这些字典的意图是私有的并用于getLevelName访问。

但我看到代码库使用from logging import _levelToName, _nameToLevel. 在 Python REPL 上尝试这个很好。

Python 3.8.10 (default, May 19 2021, 11:01:55) 
[Clang 10.0.0 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from logging import _nameToLevel, _levelToName
>>> 

但是,当您尝试在编辑器(PyCharm)中执行此操作时,即使 PyCharm 已准确设置为指向 Conda 环境,您最终也会得到关注

Cannot find reference '_levelToName' in '__init__.pyi'
Cannot find reference '_nameToLevel' in '__init__.pyi'

问题:

  1. 为什么 PyCharm 会抱怨?
  2. 用例/使用示例?

标签: pythonpython-3.xloggingpycharmpython-logging

解决方案


  1. 为什么 PyCharm 会抱怨?

仔细查看错误消息

Cannot find reference '_levelToName' in '__init__.pyi'

请注意扩展名的不同之处,.pyii不仅仅是.py. 所以导入错误在存根文件中,即这个来自 typeshed__init__.pyi而不是运行时__init__.py,您在问题的开头包含了它的摘录。

有趣的是私有属性_levelToName 实际上_nameToLevel 在 Python 3.9 存根文件中

__init__.pyi第 27-28 行

_levelToName: dict[int, str]
_nameToLevel: dict[str, int]

您使用的是 Python 3.8,同时 Python 源代码已更改为使用通用别名类型。下面是相同的 Python 3.8 代码,注意使用 now deprecatedtyping.Dict

__init__.pyi第 41-45 行

if sys.version_info >= (3,):
    _levelToName: Dict[int, str]
    _nameToLevel: Dict[str, int]
else:
    _levelNames: Dict[Union[int, str], Union[str, int]]  # Union[int:str, str:int]

总之,这是 PyCharm Linter 中的一个错误。IDE 用红色涂鸦在导入下划线,但如果您运行/调试代码,导入在运行时可以正常工作。您可以忽略导入错误,因为它只是一个 Linter 警告,但如果您稍后在代码中使用导入的属性,Linter 将添加额外的涂鸦。这是使用 PyCharm 2021.1.3 Pro 运行 Python 3.8.0 的屏幕截图。

在此处输入图像描述

我尝试在JetBrains 错误跟踪器上搜索 PyCharm,但显然尚未报告此特定问题。

  1. 用例/使用示例?

好吧,您应该访问_nameToLevel_levelToName使用诸如logging.getLevelName(level)等之类的功能...如果您检查 Python 源代码,则只有1 个要获取的函数1 个要设置 _levelToName的函数。这背后的概念是将这两个函数与文档中指定的预定义日志记录级别一起使用。


推荐阅读