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'
问题:
- 为什么 PyCharm 在抱怨?
- 用例/使用示例?
- 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 上搜索,但显然尚未报告此特定问题。
- 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
。
我正在尝试了解日志记录中可用的 _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'
问题:
- 为什么 PyCharm 在抱怨?
- 用例/使用示例?
- Why is PyCharm is complaining?
仔细查看错误信息
Cannot find reference '_levelToName' in '__init__.pyi'
请注意扩展名的不同,.pyi
有一个额外的 i
,它不仅仅是 .py
。所以导入错误在 __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-45if 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 上搜索,但显然尚未报告此特定问题。
- 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
。