web-dev-qa-db-fra.com

Différence entre la définition du typage.Dict et dict?

Je m'entraîne à utiliser des astuces de type dans Python 3.5. Un de mes collègues utilise 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 __== "__main__":
    main()

Les deux fonctionnent très bien, il ne semble pas y avoir de différence.

J'ai lu la documentation du module typing .

Entre typing.Dict ou dict lequel dois-je utiliser dans le programme?

44
Sarit

Il n'y a pas de réelle différence entre l'utilisation d'un _ typing.Dict et dict, non.

Toutefois, typing.Dict est un Type générique qui vous permet de spécifier le type des clés et des valeurs également , ce qui le rend plus flexible:

def change_bandwidths(new_bandwidths: typing.Dict[str, str],
                      user_id: int,
                      user_name: str) -> bool:

En tant que tel, il se pourrait bien qu'à un moment donné de la durée de vie de votre projet, vous souhaitiez définir l'argument dictionnaire un peu plus précisément, à quel moment développer typing.Dict à typing.Dict[key_type, value_type] est une modification "plus petite" que le remplacement de dict.

Vous pouvez rendre cela encore plus générique en utilisant les types Mapping ou MutableMapping ici; puisque votre fonction n'a pas besoin de modifier le mappage, je m'en tiendrai à Mapping. Un dict est un mappage, mais vous pouvez créer d'autres objets qui satisfont également l'interface de mappage, et votre fonction pourrait bien fonctionner avec ceux-ci:

def change_bandwidths(new_bandwidths: typing.Mapping[str, str],
                      user_id: int,
                      user_name: str) -> bool:

Maintenant, vous dites clairement aux autres utilisateurs de cette fonction que votre code ne modifiera pas réellement le new_bandwidths le mappage est passé.

Votre implémentation réelle attend simplement un objet imprimable. Cela peut être une implémentation de test, mais en l'état, votre code continuera à fonctionner si vous utilisez new_bandwidths: typing.Any, car tout objet dans Python est imprimable.

65
Martijn Pieters

typing.Dict est une version générique de dict:

class typing.Dict(dict, MutableMapping[KT, VT])

Une version générique de dict. L'utilisation de ce type est la suivante:

def get_position_in_index(Word_list: Dict[str, int], Word: str) -> int:
     return Word_list[Word]

Ici, vous pouvez spécifier le type de clé et les valeurs dans le dict: Dict[str, int]

14
AKS