-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Open
Labels
bugmypy got something wrongmypy got something wrong
Description
Bug Report
Given a subclass C
of Iterable[int]
that more specifically implements def __iter__(self) -> Iterator[bool]
(which is fine, since bool
is a subclass of int
), I would expect mypy to understand that iterating C()
yields bool
s. And indeed it does understand this in some contexts, such as iter(C())
and for item in C()
. But in other contexts, such as list(C())
and unpacking, it relies only on the base class Iterable[int]
and discards the more specific information from __iter__
.
To Reproduce
from typing import Iterable, Iterator
class C(Iterable[int]):
def __iter__(self) -> Iterator[bool]:
yield True
# these give bool, as expected
reveal_type(C().__iter__()) # Iterator[bool]
reveal_type(iter(C())) # Iterator[bool]
reveal_type([comp_item for comp_item in C()]) # list[bool]
for loop_item in C(): reveal_type(loop_item) # bool
# these unexpectedly give int
reveal_type(list(C())) # list[int]
[unpack_item] = C(); reveal_type(unpack_item) # int
[*unpack_items] = C(); reveal_type(unpack_items) # list[int]
# these unexpectedly give Any
reveal_type([*C()]) # list[Any] (#15747)
reveal_type(max(*C())) # Any
Expected Behavior
All items should be inferred as bool
.
main.py:8: note: Revealed type is "typing.Iterator[builtins.bool]"
main.py:9: note: Revealed type is "typing.Iterator[builtins.bool]"
main.py:10: note: Revealed type is "builtins.list[builtins.bool]"
main.py:11: note: Revealed type is "builtins.bool"
main.py:14: note: Revealed type is "builtins.list[builtins.bool]"
main.py:15: note: Revealed type is "builtins.bool"
main.py:16: note: Revealed type is "builtins.list[builtins.bool]"
main.py:19: note: Revealed type is "builtins.list[builtins.bool]"
main.py:20: note: Revealed type is "builtins.bool"
Actual Behavior
The items are inconsistently inferred as bool
, int
, or Any
, depending on the context.
main.py:8: note: Revealed type is "typing.Iterator[builtins.bool]"
main.py:9: note: Revealed type is "typing.Iterator[builtins.bool]"
main.py:10: note: Revealed type is "builtins.list[builtins.bool]"
main.py:11: note: Revealed type is "builtins.bool"
main.py:14: note: Revealed type is "builtins.list[builtins.int]"
main.py:15: note: Revealed type is "builtins.int"
main.py:16: note: Revealed type is "builtins.list[builtins.int]"
main.py:19: note: Revealed type is "builtins.list[Any]"
main.py:20: note: Revealed type is "Any"
One of the Any
cases was previously reported:
- Custom
__iter__
method yields false positive when used with star args (*
) #14470 - Unpacking an iterable in a list comprehension leads to the type inferred as list[Any] #15747
Your Environment
- Mypy version used: 1.7.0
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini
(and other config files): none - Python version used: 3.11
Metadata
Metadata
Assignees
Labels
bugmypy got something wrongmypy got something wrong