如何解决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
。因此,导入错误在 stub file 中,即来自类型化 __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 代码,注意使用现已弃用的 typing.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 bug tracker for PyCharm 上进行搜索,但显然尚未报告此特定问题。
- 用例/用法示例?
好吧,您应该使用 logging.getLevelName(level)
等函数访问 _nameToLevel
和 _levelToName
...如果您检查 Python 源代码,则只有 1 function to get 和 {{ 3}} _levelToName
。这背后的概念是将这 2 个函数与文档中指定的预定义 1 function to set 一起使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。