Python中接收type hint的函数参数应使用何种类型注解?
问题解答
要给接收类型注解的func参数arg添加正确的类型注解,需要覆盖类型注解可能的几种形式:具体类型对象、字符串前向引用、泛型类型别名。以下是不同场景下的解决方案:
精确适配Python 3.9+
从Python 3.9开始,typing.GenericAlias成为公开API,可以用来标注泛型类型别名(比如Union[...]、tuple[int, ...]这类构造出来的类型)。结合其他两种形式,完整的类型注解为:
from typing import Union, GenericAlias def func(arg: Union[type, str, GenericAlias]) -> None: pass func(Union[tuple[int, ...], float, "MyClass"]) class MyClass(object): pass
兼容旧版本或避免内部类型依赖
在Python 3.9之前,GenericAlias是内部的_GenericAlias(不推荐直接依赖),这时可以用object来覆盖泛型类型别名的场景,或者直接用Any简化:
用object兼容
from typing import Union def func(arg: Union[type, str, object]) -> None: pass
用Any简化
如果不需要极致的类型精确性,直接用Any是最简单的选择:
from typing import Any, Union def func(arg: Any) -> None: pass
说明
type:覆盖所有具体的类型对象,比如float、定义后的MyClassstr:覆盖字符串形式的前向引用(比如代码中的"MyClass",用于引用尚未定义的类)GenericAlias:覆盖泛型类型构造器生成的实例,比如Union[tuple[int, ...], float, "MyClass"]、list[str]这类泛型类型注解
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

