泛型外部类嵌套内部类的外部引用类型注解问题
解决嵌套泛型类的类型注解问题
要让reveal_type正确识别outer_ref为Outer[int],需要让内部类Inner关联外部类Outer的泛型参数,具体修改方案如下:
正确代码实现
from typing import Generic, TypeVar _T = TypeVar("_T") class Outer(Generic[_T]): class Inner(Generic[_T]): # 让Inner继承Generic[_T],关联外部类的泛型参数 outer_ref: Outer[_T] # 明确注解为带泛型参数的Outer类型 def __init__(self, outer_ref: Outer[_T]) -> None: self.outer_ref = outer_ref def produce_inner(self) -> Inner[_T]: # 指定返回带泛型参数的Inner类型 return Outer.Inner(self) o: Outer[int] = Outer() reveal_type(o.produce_inner().outer_ref) # 现在会正确显示为`Outer[int]`
关键修改说明
- 让Inner成为泛型类:通过
Inner(Generic[_T]),让内部类与外部类共享同一个泛型参数_T,使Inner的类型能和Outer的具体实例类型(如Outer[int])绑定。 - 修正成员变量注解:将
outer_ref: Outer改为outer_ref: Outer[_T],明确关联泛型参数,避免类型检查器识别为Outer[unknown]。 - 修正方法返回类型:把
produce_inner的返回类型从Inner改为Inner[_T],确保类型检查器能正确推导Inner的具体泛型类型。
原写法问题分析
- 直接写
outer_ref: Outer时,类型检查器无法确定Outer的泛型参数,因此显示Outer[unknown]。 - 仅给
outer_ref注解Outer[_T]但不让Inner继承Generic[_T]时,_T在Inner作用域中未被声明为泛型参数,导致Mypy报错并提示需要让Inner成为泛型类。
内容的提问来源于stack exchange,提问作者RGS
相关产品推荐
相关产品推荐

