如何为Logger.info类日志函数添加类型标注并查找更简洁类型?
问题1:Logger.info这类日志函数的类型是什么?
Python标准库logging模块中,Logger.info、Logger.debug这类日志方法本质是接受消息对象、可变位置参数,以及exc_info/stack_info等关键字参数的可调用对象。其完整类型包含复杂的联合类型定义(比如exc_info支持的多种输入类型),但可以通过预定义的类型别名简化表述。
问题2:如何为Logger.info这类日志函数添加类型标注?以及如何找到更简洁的类型?
类型标注方法
你可以直接复用类型存根中的预定义别名,或者自行封装类型别名避免冗长定义:
- 复用预定义类型别名:
import logging from logging import _LogMethod # 该别名已封装日志方法的完整类型 def get_log_method(logger: logging.Logger) -> _LogMethod: return logger.info - 自行封装简洁类型别名:
import logging from typing import Callable, Union, Mapping, Type, BaseException, TracebackType # 先封装exc_info的类型 _ExcInfoType = Union[ None, bool, Tuple[Type[BaseException], BaseException, TracebackType], Tuple[None, None, None], BaseException ] # 定义日志方法的类型别名 LogMethod = Callable[ [object, *object, exc_info: _ExcInfoType = None, stack_info: bool = False, stacklevel: int = 1, extra: Mapping[str, object] | None = None], None ] def use_log_method(log_method: LogMethod) -> None: log_method("User logged in", user_id=123)
查找更简洁类型的方法
- 查看类型存根文件:Python的类型定义存根(typeshed)中,
logging.pyi文件已为日志方法定义了简洁的类型别名(比如_LogMethod)。你可以在Python安装路径的typeshed目录找到该文件,或通过编辑器的「跳转至定义」功能(如VS Code中按住Ctrl点击Logger.info)直接查看这些预定义别名。 - 提炼重复复杂类型:将
reveal_type输出里的重复复杂定义(比如exc_info的Union集合)提取出来,封装成独立的类型别名,以此简化整体类型表述。
内容的提问来源于stack exchange,提问作者nagul
相关产品推荐
相关产品推荐

