python - 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'
问题:
- 为什么 PyCharm 会抱怨?
- 用例/使用示例?
解决方案
- 为什么 PyCharm 会抱怨?
仔细查看错误消息
Cannot find reference '_levelToName' in '__init__.pyi'
请注意扩展名的不同之处,.pyi
它i
不仅仅是.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,但显然尚未报告此特定问题。
- 用例/使用示例?
好吧,您应该访问_nameToLevel
和_levelToName
使用诸如logging.getLevelName(level)
等之类的功能...如果您检查 Python 源代码,则只有1 个要获取的函数 和1 个要设置 _levelToName
的函数。这背后的概念是将这两个函数与文档中指定的预定义日志记录级别一起使用。
推荐阅读
- python - 为什么 Python 在这里打印 else 语句?
- vue.js - 使用 ChartJS 的饼图颜色
- character - 如何删除画面中特定字符后的文本?
- statistics - 两个样本除法的样本均值和置信区间(除以零?)
- macos - Mac OS Big Sur 中的文件夹图标
- mysql - 我的 apache 没有启动,它的按钮也被禁用
- c# - 在实体框架中使用 JOIN 进行 UPDATE 的等效代码
- flutter - 父级中的 SetState 未更新 AlertDialog 的 Flutter 构建器
- r - 用于对数据框进行排序的 R 程序给了我不正确的输出
- hyperledger-sawtooth - 锯齿交易处理器没有响应