我能识别自定义拆包吗?



我有一个提供__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")

相关内容

  • 没有找到相关文章

最新更新