繁体   English   中英

如何在 Python 中使用具有泛型函数的泛型类?

[英]How can I use generic classes with a generic function in Python?

我在弄清楚如何表达我的问题时遇到了麻烦,但我有如下代码:

  1. 有一个通用类 ( BaseOuter ) 和一个方法 ( to_inner ),其返回类型是通用的。
  2. 该通用类有具体的子类(例如Outer )。 当我调用Outer().to_inner() ,推断的返回类型是我期望的Inner
  3. 我创建了一个通用函数,它接受一个可选的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM