`in` keyword should narrow Union[TypedDict, ...]
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Feature
Using in on a Union[TypedDict] should narrow the Union. There is already something similar for isinstance that can narrow based on types. If a certain key exists you could narrow down that your types from a Union as well. This would prevent an error saying a certain key is missing because you checked already, they code can safely access the key. Currently the only workaround for this would be to use cast() but really shouldn't be necessary.
Pitch
After the change the following code should pass validation.
from typing import castm Union
from typing_extensions import TypedDict
class Movie(TypedDict):
name: str
year: int
class MovieResponse(TypedDict):
movie: Movie
class Book(TypedDict):
name: str
year: int
class BookResponse(TypedDict):
book: Book
MediaResponse = Union[MovieResponse, BookResponse]
response : MediaResponse = MovieResponse(movie=Movie(name="Blade Runner", year=1982))
if 'movie' in response:
reveal_type(response) # Current: Union[MovieResponse, BookResponse]
# Desired: Union[MovieResponse]
print(response["movie"]) # This fails due to `BookResponse` not having a key "movie"
# but we already validated existance of the 'movie' key and that type
# should no longer be considered here
print(cast(MovieResponse, response)["movie"]) # current workaround
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
Empieza examinando el estrechamiento basado en isinstance existente de mypy y, después, sigue cómo se validan las comprobaciones de claves de Union y TypedDict. El trabajo está terminado cuando una comprobación in estrecha la respuesta al TypedDict coincidente y el ejemplo proporcionado supera la validación sin cast().
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- devtools
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100