Python 日志记录 - 了解 _nameToLevel 和 _levelToName 以及在编辑器和 REPL 中导入

Python logging - Understanding _nameToLevel and _levelToName along with importing in editors vs 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. 用例/使用示例?
  1. Why is PyCharm is complaining?

仔细查看错误信息

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

请注意扩展名的不同,.pyi 有一个额外的 i,它不仅仅是 .py。所以导入错误在 , namely this one from the typeshed __init__.pyi not the runtime __init__.py 中,你在问题的开头包含了它的摘录。

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

__init__.pyi lines 27-28

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

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

__init__.pyi lines 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 用红色涂鸦在导入下划线,但如果你 run/debug 代码,导入在运行时工作正常。您可以忽略导入错误,因为它只是一个 Linter 警告,但如果您稍后在代码中使用导入的属性,Linter 将添加额外的涂鸦。这是 运行 Python 3.8.0 和 PyCharm 2021.1.3 Pro.

的屏幕截图

我尝试在 JetBrains bug tracker for PyCharm 上搜索,但显然尚未报告此特定问题。

  1. A usecase / example of usage?

那么您应该使用文档中指定的 logging.getLevelName(level), etc...If you check the Python source code there's only 1 function to get and 1 function to set _levelToName. The concept behind this is using these 2 functions with the predefined Logging Levels 等函数来访问 _nameToLevel_levelToName