我有三个类:
@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()