Python类型不接受子类



我有三个类:

@dataclass(frozen=True)
class Parent:
field_a: int
@dataclass(frozen=True)
class Child(Parent):
field_b: int
class Wrapper(NamedTuple):
object_a: Dict[int, Parent]
object_b: Dict[int, Parent]

根据这个stackoverflow问题,看起来我应该能够在Wrapper中用Child替换Parent的实例。然而,当我编写这样的函数时:

def get_wrapper()->Wrapper:
return Wrapper(object_a={1: Child(1,2)}, object_b={2: Child(2,3)})

柴堆给了我类似";第一个参数object_a需要Dict[int, Parent]来调用Wrapper.__init__,但得到了Dict[int, Child]">

有人能解释一下为什么在这种情况下使用子类不起作用,以及我如何解决这个问题吗?

编辑:在我举的例子中,我似乎把这个问题过于简单化了。我的get_wrapper函数实际上是这样做的:

def get_child()->Child:
return Child(1,2)
def get_wrapper()->Wrapper:
child_a = get_child()
child_b = get_child()
return Wrapper(object_a={1: child_a}, object_b={2: child_b})

我通过将get_child的返回类型更改为Parent来修复类型错误。

虽然您的问题在多个编辑中显得支离破碎,但这正是我所反对的mypy0.920和pyre0.9.8。没有任何类型检查器引发任何错误。

from dataclasses import dataclass
from typing import Dict, NamedTuple

@dataclass(frozen=True)
class Parent:
field_a: int

@dataclass(frozen=True)
class Child(Parent):
field_b: int

class Wrapper(NamedTuple):
object_a: Dict[int, Parent]
object_b: Dict[int, Parent]

def get_child() -> Child:
return Child(1, 2)

def get_wrapper() -> Wrapper:
child_a = get_child()
child_b = get_child()
return Wrapper(object_a={1: child_a}, object_b={2: child_b})

if __name__ == "__main__":
get_wrapper()

最新更新