Diccionario de Python 3 con escritura de teclas conocidas

2 minutos de lectura

Avatar de usuario de Idok
ídolo

Estoy usando la función de escritura de Python 3 para un mejor autocompletado.

Muchas veces tengo funciones que devuelven clave/valor (diccionario) con claves específicas. ejemplo súper simple:

def get_info(name):
    name_first_letter = name[0]
    return {'my_name': name, 'first_letter': name_first_letter}

Quiero agregar sugerencias de tipo a esta función para decirles a otros que usan esta función qué esperar.

Puedo hacer algo como:

 class NameInfo(object):
     def __init__(self, name, first_letter):
         self.name = name
         self.first_letter = first_letter

y luego cambie la firma de la función a:

def get_info(name) -> NameInfo:

Pero requiere demasiado código para cada diccionario.

¿Cuál es la mejor práctica en ese caso?

  • ¿Has considerado usar collections.namedtuple para crear sus tipos personalizados? Solo crea tipos inmutables, pero dependiendo de cómo estaba usando los diccionarios antes, eso podría no ser un problema.

    – Caballero negro

    28 de mayo de 2017 a las 9:48

  • También puedes intentar usar Dict[str, str] escriba la sugerencia de mecanografía módulo.

    – Stanislav Ivánov

    28 de mayo de 2017 a las 10:08

  • @Blckknght gracias por recordarme esta opción. Encontré exactamente lo que necesito. Hay un tipo llamado tupla docs.python.org/3/library/typing.html#typing.NamedTuple

    – Idok

    28 de mayo de 2017 a las 10:38


  • Consulte también: stackoverflow.com/q/51031757/6646912

    – krassowski

    25 de enero de 2019 a las 0:02

  • Relacionado: ¿Cómo usar la verificación de tipos estáticos usando Dict con diferentes tipos de valores en Python 3.6?

    – georgia

    10 oct 2019 a las 15:20

Como señaló Blckknght, usted y Stanislav Ivanov en los comentarios, pueden usar NamedTuple:

from typing import NamedTuple


class NameInfo(NamedTuple):
    name: str
    first_letter: str


def get_info(name: str) -> NameInfo:
    return NameInfo(name=name, first_letter=name[0])

A partir de Python 3.8 puedes usar TypedDict que es más similar a lo que quieres:

from typing import TypedDict


class NameInfo(TypedDict):
    name: str
    first_letter: str


def get_info(name: str) -> NameInfo:
    return {'name': name, 'first_letter': name[0]}

  • De esta manera, obtiene algunas limitaciones específicas de la clase, por ejemplo, no puede empaquetar su clase usando msgpack.

    – Prisacari Dmitrii

    4 de julio de 2019 a las 11:18

  • cómo definir, que NameInfo tiene clave con símbolos de servicio, por ejemplo last#name: str?

    – Iván Bryzzin

    23 de enero de 2020 a las 10:25


  • @IvanBryzzhin Puede intentar usar una sintaxis alternativa.

    – georgia

    31 de enero de 2020 a las 14:39

  • Sin embargo, esto solo funciona para las teclas str.

    – Jerinaw

    26 de agosto de 2022 a las 16:35

¿Ha sido útil esta solución?