[英]How can I use generic classes with a generic function in Python?
我在弄清楚如何表达我的问题时遇到了麻烦,但我有如下代码:
BaseOuter
) 和一个方法 ( to_inner
),其返回类型是通用的。Outer
)。 当我调用Outer().to_inner()
,推断的返回类型是我期望的Inner
。BaseOuter
并在其上调用to_inner()
。 但是当我将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())
需要在BaseOuter
泛型类中添加InnerType
注解,因为在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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.