Diferencia entre definir mecanografía. ¿Dict y dict?
Estoy practicando el uso de sugerencias de escritura 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?
No existe una diferencia real entre usar un simple typing.Dict
y dict
no.
Sin embargo, typing.Dict
es un tipo Genérico * que también le permite especificar el tipo de claves y valores , haciéndolo 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 de su proyecto desee definir el argumento del diccionario con un poco más de precisión, momento en el cual expandir typing.Dict
a typing.Dict[key_type, value_type]
es un cambio "menor" que reemplazar dict
.
Puedes hacer esto aún más genérico usando Mapping
o MutableMapping
escribe aquí; Dado que su función no necesita alterar el mapeo, me quedaría con Mapping
. A dict
es un mapeo, pero podrías crear otros objetos que también satisfagan la interfaz de mapeo, y tu función podría seguir funcionando con ellos:
def change_bandwidths(new_bandwidths: typing.Mapping[str, str],
user_id: int,
user_name: str) -> bool:
Ahora les está diciendo claramente a otros usuarios de esta función que su código en realidad no alterará la new_bandwidths
asignación pasada.
Su implementación real simplemente espera un objeto que sea imprimible. 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.
* : Nota: Si está utilizando Python 3.7 o posterior, puede usarlo dict
como tipo genérico si inicia su módulo con from __future__ import annotations
, y a partir de Python 3.9 dict
(así como otros contenedores estándar) admite el uso como tipo genérico incluso sin eso. directiva .
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]
Si viene de Google para
TypeError: Too few parameters for typing.Dict; actual 1, expected 2
, debe proporcionar un tipo tanto para la clave como para el valor.
Entonces, Dict[str, str]
en lugar deDict[str]