Unpacking an iterable in a list comprehension leads to the type inferred as list[Any]
Offen
Dieses Issue hat noch niemand übernommen.
bug
good-second-issue
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
When a value of a user-defined class with __iter__ is converted into a list using [*value], the type of the list is inferred as list[Any].
To Reproduce
import typing
class Spam:
def __iter__(self, /) -> typing.Iterator[int]:
yield 1
a = Spam()
# list[int]
reveal_type(list(a))
# list[int]
reveal_type([i for i in a])
# list[int]
reveal_type([*(i for i in a)])
# list[int]
reveal_type([*a.__iter__()])
# list[Any] ???
reveal_type([*a])
b, = a
# int
reveal_type(b)
Expected Behavior
The type of [*a] is list[int]
Actual Behavior
example.py:22: note: Revealed type is "builtins.list[Any]"
Your Environment
- Mypy version used: 1.4.1
- Mypy command-line flags:
--strict - Mypy configuration options from
mypy.ini(and other config files): - Python version used:
3.11.4
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem Reproducer im Issue und verfolge, wie Listendarstellungen Sternausdrücke und Iterable-Typen verarbeiten. Füge einen Regressionstest für ein benutzerdefiniertes iter hinzu, das Iterator[int] zurückgibt, und überprüfe anschließend, dass [*a] als list[int] inferiert wird, ohne die anderen angezeigten Typen zu verändern.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 45/100