Unpacking an iterable in a list comprehension leads to the type inferred as list[Any]
Abierto
Nadie ha tomado este issue todavía.
bug
good-second-issue
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con el reproductor del issue y sigue cómo las expresiones de lista gestionan las expresiones desempaquetadas y los tipos iterables. Añade una prueba de regresión para un iter definido por el usuario que devuelva Iterator[int] y, después, verifica que [*a] se infiere como list[int] sin cambiar los demás tipos revelados.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 45/100