我有一个提供__getitem__
的类- python很乐意使用它来解包,但是当我在代码上运行mypy时,我得到List or tuple expected as variable arguments
。
这是一个最小复制器
from typing import Any
class Foo:
def __getitem__(self, idx: int) -> Any:
if idx == 0:
return 1
if idx == 1:
return "bye"
else:
raise IndexError
f = Foo()
t = ("hello", *f)
print(t) # prints ("hello", 1, "bye")
我不想在我做*f
的每个点上添加错误抑制,这会破坏类的整个目的。
有没有办法让我明白打开一个Foo
是可以的?
如果有关系,我目前使用的是mypy 0.800,和Python 3.7.6。
看起来MyPy期望不可打包对象具有__iter__
方法-这在某种程度上是公平的,因为对象实现__getitem__
而不实现__iter__
是相当罕见的。你可以通过一点谎言让MyPy错误消失:告诉MyPy有一个__iter__
方法,即使你不打算实现一个。似乎可以在python 3.7/MyPy 0.800以及python 3.10/MyPy 0.910上工作。
from typing import Any, Callable, Iterator
class Foo:
__iter__: Callable[["Foo"], Iterator[Any]]
def __getitem__(self, idx: int) -> Any:
if idx == 0:
return 1
if idx == 1:
return "bye"
else:
raise IndexError
f = Foo()
t = ("hello", *f)
print(t) # prints ("hello", 1, "bye")