迭代器的类型是 zip 中的 Any

问题描述 投票:0回答:1

以下脚本:

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])
确实允许正确的类型解析,但这不是这里的问题;)

python mypy
1个回答
0
投票

我并不积极,但我认为

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)
© www.soinside.com 2019 - 2024. All rights reserved.