Python NamedTuple的子类化提供了不兼容的返回类型/参数类型
考虑以下代码段:Python NamedTuple的子类化提供了不兼容的返回类型/参数类型,python,mypy,Python,Mypy,考虑以下代码段: class A_TUPLE(NamedTuple): ... class Animal: def get(self) -> Sequence[NamedTuple]: ... def get_one(self, x: Sequence[NamedTuple]) -> None: ... class Dog(Animal): def get(self) -> Sequence[A_TUPLE]
class A_TUPLE(NamedTuple):
...
class Animal:
def get(self) -> Sequence[NamedTuple]:
...
def get_one(self, x: Sequence[NamedTuple]) -> None:
...
class Dog(Animal):
def get(self) -> Sequence[A_TUPLE]: # error: Return type "Sequence[A_TUPLE]" of "get" incompatible with return type "Sequence[NamedTuple]" in supertype "Animal"
...
def get_one(self, x: Sequence[A_TUPLE]) -> None: # error: Argument 1 of "get_one" is incompatible with supertype "Animal"; supertype defines the argument type as "Sequence[NamedTuple]"
...
在上面的代码段上运行mypy会产生错误,如注释所示
这应该是可能的。
序列[NamedTuple]
和序列[A_TUPLE]
只有在事先知道NamedTuple
的名称/类型时才能兼容。否则,仅使用NamedTuple
声明,无法验证派生类的返回类型是否与基类兼容或类型安全
e、 g.这将起作用:
class A_TUPLE(NamedTuple):
a: str
b: int
class Animal:
def get(self) -> Sequence[Tuple[str, int]]:
...
class Dog(Animal):
def get(self) -> Sequence[A_TUPLE]: # okay!
...
第二个函数def get_one(self,x:Sequence[A_TUPLE])
有一个不同的问题。
基类版本表示get_one()可以接受任何元组,而派生版本需要特定类型的A_元组。但是如果你有一只狗,你可以把它当作动物对待。所以狗必须接受动物所接受的一切,但这里的情况并非如此