类型注释中封闭范围的引用类型变量

问题描述 投票:0回答:1

我有两个嵌套类,外层是通用的。

内层引用了外层。

如何注释内部对外部的引用,以便下面代码片段底部的

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__
没有任何问题。

python mypy python-typing
1个回答
2
投票

您需要

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]`
© www.soinside.com 2019 - 2024. All rights reserved.