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?
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.
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]