í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?
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
¿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