Python 3.x python 3.7.0 mypy 0.641扩展python';列表和用户列表?

Python 3.x python 3.7.0 mypy 0.641扩展python';列表和用户列表?,python-3.x,mypy,Python 3.x,Mypy,我试图用一些自定义方法扩展pythons的列表,为此我 我正在创建一个从UserList继承的类 我不确定什么是正确的方法,我想玩mypyplay 与用户列表配合得很好 我在mypy中查阅并搜索了 UserList但找不到任何内容 使用: mypy 0.641 python 3.7.0 这是我试图实现的一个最小的例子 from collections import UserList from typing import List, Optional, Union class A:

我试图用一些自定义方法扩展pythons的
列表
,为此我 我正在创建一个从
UserList
继承的类

我不确定什么是正确的方法,我想玩
mypy
play 与
用户列表
配合得很好

我在
mypy
中查阅并搜索了
UserList
但找不到任何内容

使用:

  • mypy 0.641
  • python 3.7.0
这是我试图实现的一个最小的例子

from collections import UserList
from typing import List, Optional, Union


class A:
    ...


class B:
    ...


class C:
    ...


TMessage = Union[A, B, C]


class MyList(UserList):
    """Minimal example"""

    def __init__(self, data: Optional[List[TMessage]] = None) -> None:
        self.data: List[TMessage] = []
        if data:
            self.data = data[:]

    def get_last(self) -> TMessage:
        return self.data[-1]

    # other methods to be added ...


some_data = [A(), B(), C(), C(), B(), A()]
my_list_a = MyList(some_data)
my_list_b = MyList(some_data)

my_list_b = my_list_a[3:]
Mypy抱怨如下

~/tmp ❯❯❯ mypy mypy_userlist.py

mypy_userlist.py:34: error: Argument 1 to "MyList" has incompatible type "List[object]"; expected "Optional[List[Union[A, B, C]]]"
mypy_userlist.py:35: error: Argument 1 to "MyList" has incompatible type "List[object]"; expected "Optional[List[Union[A, B, C]]]"
mypy_userlist.py:37: error: Incompatible types in assignment (expression has type "MutableSequence[Any]", variable has type "MyList")
我可以在冲突行中添加
#type:ignore
,但我希望 为了避免这种情况

使用自定义方法扩展python列表的正确方法是什么
让mypy开心吗?

我在mypy还是个新手,但我认为你有两个问题。第一个是列表是可变的,因此尽管列表对象
某些数据
满足了代码中所需的结构,但没有理由以后不能将类型为
A
B
C
的对象添加到列表中,这意味着在编译平铺时,Mypy无法确保

my_list_a = MyList(some_data) 
是一个有效的赋值。(有关更多讨论,请查看Mypy文档的“常见问题”部分)

您可以通过显式注释
某些数据来解决此问题:

some_data : List[TMessage] = [A(), B(), C(), C(), B(), A()]
当您修复此问题时,当您尝试使用切片分配两个列表时,会出现第二个问题。MyPy不知道slice函数将返回什么,并且会抱怨不兼容的类型

要解决这个问题,您可以显式地在类中实现切片功能

def __getitem__(self, slice_indices) -> 'MyList':
     return self.data[slice_indices]

那很有帮助,谢谢!我从
用户列表
扩展的动机是避免重新定义方法,如
\uuuu getitem\uuuuuuuuuuuuuuuuu setitem\uuuuuuuuu
(在我的示例中,我已经定义了
\uuuuuu init\uuuuuuuuuuuuuuu>,这也是我想要避免的)。如果最终不得不重新实现它们,我看不出从
UserList
继承有什么意义。也许我应该实现我的ow类,定义我需要的类型,忘记从
UserList
扩展。很高兴我能提供帮助。我尝试过尝试,但如果不至少实现其中一些功能,我就找不到让MyPy开心的方法。它确实节省了您实现
append
etc的时间,并允许您将
MyList
输入到需要列表输入的函数中,所以继承有很多优点。