Diferencia entre definir mecanografía. ¿Dict y dict?

Resuelto joe asked hace 8 años • 4 respuestas

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 typingdocumentación del módulo .

¿ Entre typing.Dicto dictcuál debo usar en el programa?

joe avatar May 07 '16 17:05 joe
Aceptado

No existe una diferencia real entre usar un simple typing.Dicty dictno.

Sin embargo, typing.Dictes 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.Dicta typing.Dict[key_type, value_type]es un cambio "menor" que reemplazar dict.

Puedes hacer esto aún más genérico usando Mappingo MutableMappingescribe aquí; Dado que su función no necesita alterar el mapeo, me quedaría con Mapping. A dictes 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_bandwidthsasignació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 dictcomo 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 .

Martijn Pieters avatar May 07 '2016 10:05 Martijn Pieters

typing.Dictes 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]

AKS avatar May 07 '2016 10:05 AKS

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]

snowskeleton avatar Dec 04 '2022 00:12 snowskeleton