如何用Python Typing定义输入输出类型映射的函数签名?
实现方法
你可以通过两种方式实现这个类型定义,其中@overload重载的方式最直观且能被静态类型检查工具精准识别:
方法一:使用@overload明确多场景类型签名
@overload可以为同一个函数定义不同的输入输出类型对应关系,静态检查工具(如mypy)会根据输入参数类型匹配对应的返回类型:
from typing import overload @overload def g(arg: str) -> bool: ... @overload def g(arg: list[str]) -> list[bool]: ... def g(arg): # 示例实现逻辑 if isinstance(arg, str): return len(arg) > 0 elif isinstance(arg, list): return [len(s) > 0 for s in arg]
方法二:使用TypeVar结合联合类型
这种方式用单个类型变量约束输入范围,但返回类型是联合类型,静态检查无法精确推断具体返回类型:
from typing import TypeVar, Union T = TypeVar('T', str, list[str]) ReturnType = Union[bool, list[bool]] def g(arg: T) -> ReturnType: # 示例实现逻辑 if isinstance(arg, str): return len(arg) > 0 elif isinstance(arg, list): return [len(s) > 0 for s in arg]
如果使用Python 3.10+,可省去typing模块的部分导入,直接用原生类型注解:
from typing import overload @overload def g(arg: str) -> bool: ... @overload def g(arg: list[str]) -> list[bool]: ... def g(arg): if isinstance(arg, str): return len(arg) > 0 elif isinstance(arg, list): return [len(s) > 0 for s in arg]
内容的提问来源于stack exchange,提问作者scravy
相关产品推荐
相关产品推荐

