9

我有一个继承自MutableSequence这样的类:

class QqTag(MutableSequence):
    def __init__(self):
        self._children = []
    def __getitem__(self, idx: int) -> 'QqTag':
        return self._children[idx]

mypy抱怨说Signature of "__getitem__" incompatible with supertype "Sequence"

Sequence中,该方法定义为:

@abstractmethod
def __getitem__(self, index):
    raise IndexError

那么,问题出在哪里,为什么mypy对我的实现不满意?

4

2 回答 2

5

正如评论中提到的,也可以传递 typeof 切片。即,更改idx: intidx: Union[int, slice].

这会让 mypy 开心(至少在我的机器上):

class QqTag(MutableSequence):
    def __init__(self):
        self._children = []

    def __getitem__(self, idx: Union[int, slice]) -> 'QqTag':
        return self._children[idx]
于 2018-03-10T22:36:55.057 回答
0

另一种选择是使用typing.overload装饰器。

from typing import overload

class QqTag(MutableSequence):
    def __init__(self):
        self._children = []
    @overload
    def __getitem__(self, i: int) -> 'QqTag':
        ...
    @overload
    def __getitem__(self, s: slice) -> list['QqTag']:
        ...
    def __getitem__(self, idx):
        return self._children[idx]

请参阅打字PEP 484 - 类型提示中的示例。

于 2021-12-18T15:40:16.567 回答