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.

Pistas de tipo dinámico derivadas de las claves y valores de un diccionario en Python.

En el código a continuación, ¿cómo puedo tener my_dict_keys_type y my_dict_values_type sin actualizarlos manualmente cada vez que cambie el diccionario?

my_dict = {
  "a": 1,
  "b": "2",
  "c": True
}
my_dict_keys_type = Union[Literal["a"], Literal["b"], Literal["c"]]
my_dict_values_type = Union[int, str, bool]

def get(key: my_dict_keys_type) -> my_dict_values_type:
  return my_dict[key]

Necesito que el IDE lo verifique mediante comprobación de tipos, ¿quizás hay alguna forma de usar un tipo genérico?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puedes utilizar el tipo de sugerencia de tipo typing.Dict incorporado con TypeVar para que my_dict_keys_type y my_dict_values_type se actualicen automáticamente cuando el diccionario cambie. Aquí está el código modificado:

    from typing import Dict, TypeVar, Union, Literal
    
    my_dict = {
      "a": 1,
      "b": "2",
      "c": True
    }
    
    K = TypeVar('K', bound=str)
    my_dict_keys_type = Literal[my_dict.keys()]
    my_dict_values_type = Union[int, str, bool]
    my_dict_type = Dict[K, my_dict_values_type]
    
    def get(key: K) -> my_dict_values_type:
      return my_dict[key]
    

    Explicación:

    • TypeVar nos permite crear un tipo de marcador de posición K que representa el tipo de las claves del diccionario.
    • my_dict.keys() devuelve un objeto dict_keys que es una vista iterable de las claves del diccionario. Puede utilizarse como una sugerencia de tipo literal, es decir, una sugerencia de tipo que representa los valores exactos que se pueden utilizar para ese parámetro, envolviéndolo con Literal.
    • my_dict_type es una sugerencia de tipo genérico para un diccionario con claves de tipo K y valores de tipo my_dict_values_type.
    • La función get ahora utiliza la sugerencia de tipo genérico K para el parámetro key, y my_dict_type para la sugerencia de tipo del diccionario.

Comments are closed.