带TypeVar的泛型类型别名:如何让Optional版本支持泛型参数?
解决泛型类型别名的Optional版本定义问题
你遇到的报错是因为MyTypeOpt = Optional[MyType]这种写法把MyTypeOpt变成了非泛型类型别名——MyType本身是需要传入类型参数的泛型,直接套Optional后,它丢失了接收类型参数的能力,所以mypy会提示你不能给它传[int]。
要实现无需重复写Optional[MyType[...]]的需求,你需要让MyTypeOpt本身保持泛型特性,正确的定义方式如下:
from typing import TypeVar, Union, Optional T = TypeVar('T') MyType = Union[list[T], tuple[T]] # 让MyTypeOpt成为带泛型参数的别名 MyTypeOpt = Optional[MyType[T]] def opt_func(a: MyTypeOpt[int] = None): pass
如果是Python 3.10及以上版本,推荐用TypeAlias装饰器明确标注泛型类型别名,可读性更强:
from typing import TypeVar, Union, Optional, TypeAlias T = TypeVar('T') MyType: TypeAlias = Union[list[T], tuple[T]] MyTypeOpt: TypeAlias = Optional[MyType[T]] def opt_func(a: MyTypeOpt[int] = None): pass
这样定义后,MyTypeOpt就可以像MyType一样接收类型参数,内部会自动将参数传递给MyType并套上Optional,完美实现你想要的简化写法。
内容的提问来源于stack exchange,提问作者mysh
相关产品推荐
相关产品推荐

