python - tipo - Diferencia entre definir tipeo. ¿Dict y dict?
que es un diccionario en python (2)
Estoy practicando el uso de sugerencias de tipo en Python 3.5. Uno de mis colegas usa el 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 una diferencia.
He leído la documentación del módulo de typing
.
Entre typing.Dict
o decir cuál debo usar en el programa?
No hay una diferencia real entre el uso de una typing.Dict
y dict
, no.
Sin embargo, typing.Dict
es un tipo genérico que le permite especificar el tipo de las claves y los valores también , lo que lo hace más flexible:
def change_bandwidths(new_bandwidths: typing.Dict[str, str],
user_id: int,
user_name: str) -> bool:
Como tal, bien podría ser que en algún momento de la vida útil de su proyecto desee definir el argumento del diccionario con un poco más de precisión, momento en el que se expandirá la typing.Dict
typing.Dict[key_type, value_type]
reemplazando dict
.
Puede hacer esto aún más genérico utilizando los tipos Mapping
o MutableMapping
aquí; Ya que tu función no necesita alterar el mapeo, me quedo con el Mapping
. Un dict
es una asignación, pero puede crear otros objetos que también satisfagan la interfaz de asignación, 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 claramente le está diciendo a otros usuarios de esta función que su código no alterará realmente el mapeo de new_bandwidths
pasado.
Su implementación real es simplemente esperar un objeto que se pueda imprimir. Esa puede ser una implementación de prueba, pero tal como está, su código continuaría funcionando si usara new_bandwidths: typing.Any
, porque cualquier objeto en Python es imprimible.
typing.Dict
es una versión genérica de dict
:
class typing.Dict(dict, MutableMapping[KT, VT])
Una versión genérica de dict. El uso de este tipo es el siguiente:
def get_position_in_index(word_list: Dict[str, int], word: str) -> int: return word_list[word]
Aquí puede especificar el tipo de clave y valores en el dict: Dict[str, int]