es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Anidamiento de Notación de Tipos Resultados Diferentes.

He estado intentando mejorar algunas clases de código con sugerencias de tipo. Estoy teniendo problemas con un problema de anidamiento. El parámetro de una función de interés es un contenedor iterable de objetos con tipos conocidos. Me cuesta hacer que mi IDE reconozca los tipos internos (lo cual es una comodidad agradable).

Estoy utilizando Python 3.9 en PyCharm, pero obtengo resultados similares en IPython.

Cuando uso la clase “Iterable” del módulo “typing”, el IDE no puede “ver a través” de los tipos internos. Lo mismo ocurre con “Collection”. Pero sí puede cuando uso “list” o “tuple” en el contenedor externo.

¿Es esto un problema del IDE o hay otra forma de empaquetarlo? Sería bueno poder enviar cualquier tipo de iterable a esta función, en lugar de codificarlo de forma rígida…

from datetime import datetime
from typing import Iterable

Data_collection = Iterable[tuple[datetime, str]]
Data_list = list[tuple[datetime, str]]

def foo(bar: Data_collection):
    bar[1][0].    # no hay sugerencia de tipo en el objeto interno

def foo2(bar: Data_list):
    bar[1][0].    # buena sugerencia de tipo en el objeto interno

Me proporciona resultados como estos (en PyCharm):

Imagen 1

Imagen 2

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que esto podría ser un problema con el uso de Iterable y Collection del módulo typing. Estas clases parecen no proporcionar una forma fácil de especificar los tipos internos del contenedor. Sin embargo, al usar list o tuple en el contenedor exterior sí parece proporcionar el tipado deseado para los objetos internos.

    Una posible solución podría ser definir un alias de tipo personalizado que combine el uso de Iterable con tuple o list para el contenedor externo, junto con los tipos internos especificados. Por ejemplo:

    from datetime import datetime
    from typing import TypeVar, Iterable
    
    T = TypeVar('T', tuple, list)
    
    DataContainer = Iterable[T[datetime, str]]
    
    def foo(bar: DataContainer):
        bar[1][0].  # debería tener un tipado en el objeto interno
    

    Esto debería proporcionar el tipado deseado tanto para el contenedor externo como para los objetos internos.

Comments are closed.