python - 如何在 Python 中使用具有泛型函数的泛型类?
问题描述
我很难弄清楚如何表达我的问题,但我有如下代码:
- 有一个泛型类 (
BaseOuter
) 和一个方法 (to_inner
),其返回类型是泛型的。 - 该通用类有具体的子类(例如
Outer
)。当我调用Outer().to_inner()
时,推断的返回类型Inner
与我预期的一样。 - 我创建了一个通用函数,它接受一个可选参数
BaseOuter
并调用to_inner()
它。但是当我将 an 传递Outer
给这个函数时,推断的返回类型是BaseInner
,而不是Inner
我预期的那样。
难道我做错了什么?有没有办法让类型检查器意识到to_inner(Outer())
返回一个Inner
?
import typing
class BaseInner:
pass
T_co = typing.TypeVar('T_co', bound=BaseInner, covariant=True)
T = typing.TypeVar('T', bound=BaseInner)
class BaseOuter(typing.Generic[T_co]):
def to_inner(self) -> T_co:
return self.InnerType()
@typing.overload
def to_inner(outer: BaseOuter[T]) -> T: ...
@typing.overload
def to_inner(outer: None) -> None: ...
def to_inner(outer: typing.Optional[BaseOuter[T]]) -> typing.Optional[T]:
return outer.to_inner() if outer else None
class Inner(BaseInner):
pass
class Outer(BaseOuter[Inner]):
InnerType = Inner
this_is_an_Inner = Outer().to_inner()
unfortunately_a_BaseInner = to_inner(Outer())
解决方案
您需要为泛型类添加InnerType
注释BaseOuter
,因为此名称用于to_inner
方法中。否则,mypy
(0.910) 将无法理解您的意图:
class BaseOuter(typing.Generic[T_co]):
InnerType: typing.Type[T_co] # <---
def to_inner(self) -> T_co:
return self.InnerType()
推荐阅读
- reactjs - ReactRouterHashLink 不能很好地与材质 UI 抽屉配合使用
- java - 工具栏干扰使用 SearchView 过滤 RecyclerView
- swift - 快速解码复合结构数据
- javascript - 滚动时,YouTube 视频嵌入在移动设备上消失
- java - 如何获取页面中多个 URL 的所有链接并检查它是否损坏并在 Excel 表中更新?
- c# - Entity Framework Core 3.1.3 在 AWS Lambda 函数和 AWS API Gateway 无服务器 API 中使用的第一个查询非常慢
- python - 在python中调用函数之前的“例程”函数
- flutter - 如何在颤动中自定义位置按钮?
- php - 删除 foreach 循环的最后一个字符串值
- azure - 我们可以在 ARM 模板部署期间像 Azure 对应用服务域那样运行休息调用吗?