我有两个嵌套类,外层是通用的。
内层引用了外层。
如何注释内部对外部的引用,以便下面代码片段底部的
reveal_type
正常工作?
from typing import Generic, TypeVar
_T = TypeVar("_T")
class Outer(Generic[_T]):
class Inner:
outer_ref: Outer # <- What goes here?
def __init__(self, outer_ref: Outer[_T]) -> None:
self.outer_ref = outer_ref
def produce_inner(self) -> Inner:
return Outer.Inner(self)
o: Outer[int] = Outer()
reveal_type(o.produce_inner().outer_ref) # Should be `Outer[int]`.
我试着输入
outer_ref
作为 outer_ref: Outer
但这会显示 Outer[unknown]
.
如果我输入
outer_ref
作为 outer_ref: Outer[_T]
,我会收到一条警告,说变量在那里没有意义,Mypy 会建议我添加 Generic[_T]
或 Protocol[_T]
到 Inner
,显示的类型是 Outer[_T@Outer]
。
请注意,MyPy 似乎对
outer_ref: Outer[_T]
签名中的类型注释 Inner.__init__
没有任何问题。
您需要
Inner
也是一个 Generic
,具有自己的类型参数,并通过 produce_inner
上的注释将两个参数联系在一起:
from typing import Generic, TypeVar
_T = TypeVar("_T")
_I = TypeVar("_I")
class Outer(Generic[_T]):
class Inner(Generic[_I]):
def __init__(self, outer_ref: 'Outer[_I]') -> None:
self.outer_ref = outer_ref
def produce_inner(self) -> Inner[_T]:
return Outer.Inner(self)
o: Outer[int] = Outer()
reveal_type(o.produce_inner().outer_ref) # `Outer[int]`