【发布时间】:2020-02-27 09:36:15
【问题描述】:
请检查以下代码
import typing
import abc
class A(abc.ABC):
@abc.abstractmethod
def f(self) -> typing.NamedTuple[typing.Union[int, str], ...]:
...
class NT(typing.NamedTuple):
a: int
b: str
class B(A):
def f(self) -> NT:
return NT(1, "s")
print(B().f())
我得到一个错误。在父类A 中,我想定义方法f,这样我就表明任何子类都应该通过返回由int 或str 字段组成的NamedTuple 来覆盖它。
但我收到一条错误消息:
TypeError: 'NamedTupleMeta' object is not subscriptable
如下更改签名会有所帮助,但我将如何告诉打字系统子类可以返回只有 int 和 str 的 NamedTuples
class A(abc.ABC):
@abc.abstractmethod
def f(self) -> typing.NamedTuple:
...
【问题讨论】:
-
你不能也使用
NT作为A类中的类型吗? -
@Dan 不过,大概是 OP 希望能够使用
class Foo(NamedTuple): bar: int,然后那将无法正常工作 -
现在,我对类型系统的了解并不多,但是静态类型检查器如何使用它呢?如果你只知道它是某种类型,它具有一定数量的
typing.Union[str, int]属性,那么你仍然不得不抱怨foo.bar,因为该类型不知道 bar...
标签: python python-3.x python-typing