Estoy practicando el uso de sugerencias de tipo en Python 3.5. Uno de mis colegas usa typing.Dict
:
import typing
def change_bandwidths(new_bandwidths: typing.Dict,
user_id: int,
user_name: str) -> bool:
print(new_bandwidths, user_id, user_name)
return False
def my_change_bandwidths(new_bandwidths: dict,
user_id: int,
user_name: str) ->bool:
print(new_bandwidths, user_id, user_name)
return True
def main():
my_id, my_name = 23, "Tiras"
simple_dict = {"Hello": "Moon"}
change_bandwidths(simple_dict, my_id, my_name)
new_dict = {"new": "energy source"}
my_change_bandwidths(new_dict, my_id, my_name)
if __name__ == "__main__":
main()
Ambos funcionan bien, no parece haber diferencia.
He leído la typing
documentación del módulo .
¿Entre typing.Dict
o dict
cuál debo usar en el programa?
python
dictionary
type-hinting
Sarit
fuente
fuente
def a(b: int) -> bool:
es un error de sintaxis en Python 2.7, y creo que también es un error de sintaxis en versiones anteriores de Python 3.Respuestas:
No hay una diferencia real entre usar un simple
typing.Dict
ydict
no.Sin embargo,
typing.Dict
es un tipo genérico que le permite especificar el tipo de claves y valores también , haciéndolo más flexible:def change_bandwidths(new_bandwidths: typing.Dict[str, str], user_id: int, user_name: str) -> bool:
Como tal, podría ser que en algún momento de la vida de su proyecto desee definir el argumento del diccionario con un poco más de precisión, momento en el que expandir
typing.Dict
atyping.Dict[key_type, value_type]
es un cambio 'menor' que reemplazardict
.Puede hacer esto aún más genérico usando
Mapping
oMutableMapping
tipos aquí; dado que su función no necesita alterar el mapeo, me quedo conMapping
. Adict
es un mapeo, pero puede crear otros objetos que también satisfagan la interfaz de mapeo, y su función podría seguir funcionando con esos:def change_bandwidths(new_bandwidths: typing.Mapping[str, str], user_id: int, user_name: str) -> bool:
Ahora le está diciendo claramente a otros usuarios de esta función que su código en realidad no alterará el
new_bandwidths
mapeo pasado.Su implementación real solo espera un objeto que sea imprimible. Esa puede ser una implementación de prueba, pero tal como está, su código continuaría funcionando si lo usara
new_bandwidths: typing.Any
, porque cualquier objeto en Python es imprimible.fuente
{"name": "bob", "age" : 51}
, por ejemplo , ¿sería algo así comotyping.Mapping[Union[str, int]
? ¿Qué pasa con un diccionario anidado como{"person": {"name":"bob", "age": 51}
sería algo asítyping.Mapping[str, typing.Mapping[Union[str, int]]
? UsarloUnion
así me preocupa porque no es un esquema estricto, ya que no hay pedidos. Quizás eso esté bien, ¿o hay alguna alternativa?Union
pregunta, veo que sigue siendo una discusión abierta github.com/python/typing/issues/28typing.Dict
es una versión genérica dedict
:Aquí puede especificar el tipo de clave y valores en el dict:
Dict[str, int]
fuente