以下脚本:
from collections.abc import Iterable, Iterator
class A(Iterable):
_list: list[int]
def __init__(self, *args: int) -> None:
self._list = list(args)
def __iter__(self) -> Iterator[int]:
return iter(self._list)
a = A(1, 2, 3)
for i in a:
reveal_type(i)
for s, j in zip("abc", a):
reveal_type(j)
产生以下 mypy 输出:
$ mypy test.py
test.py:17: note: Revealed type is "builtins.int"
test.py:20: note: Revealed type is "Any"
Success: no issues found in 1 source file
为什么在
Any
上迭代时类型是zip
,而不是直接在对象上?
注意,子类化
class A(Iterable[int])
确实允许正确的类型解析,但这不是这里的问题;)
我并不积极,但我认为
A
不够通用(Iterable
相当于Iterable[Any]
)。如果将类型变量添加到 A
的定义中,您将获得预期的显示类型。
T = TypeVar('T')
class A(Iterable[T]):
_list: list[T]
def __init__(self, *args: T) -> None:
self._list = list(args)
def __iter__(self) -> Iterator[T]:
return iter(self._list)