Bonjour,
J'essaie de trouver un moyen pour faire une sorte de "deep_update" de dictionnaire par gérer du paramétrage avec surcharge à différent niveau.
L'idée est que si j'ai un dictionnaire arborescent de paramètres je puisse le compléter par un autre dictionnaire arborescent.
Je voudrais par ailleurs que cela soit très générique pour me permettre de le réutiliser dans toute sortes de cas.
Pour décrire l'arborescence du dictionnaire, je fais des trucs du genre (code complet plus bas)
Mais ça ne marche pas : seule la première clé de dico 2 est prise en considération. Les boucles ne se font pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 def deep_update(dico1, dico2): for k, v in dico2.items(): deep_copy(dico1[k], dico2[k])
Quelqu'un voit-il pourquoi cela ne fonctionne pas ?
Voici un code complet pour ceux qui voudraient tester le programme :
Merci pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 # -*- coding: iso-8859-1 -*- def deep_update(dict_1, dict_2): """ Met à jour dict_1 en fonction de dict_2 """ # Les procédures employées sont légèrement différentes si les # éléments à mettre à jour sont des listes et non des dico if type(dict_1) == type([]): if type(dict_2) == type([]): for key, value in enumerate(dict_2): try: dict_1[key] = deep_update(dict_1[key], value) except IndexError: dict_1.append(value) return dict_1 elif type(dict_2) == type({}): # cette ruse est là pour permettre de mettre à jour un élément # précis d'une liste (voir le cas '2' dans l'exemple ci dessous) for key, val in dict_2.items(): dict_1[int(key)] = deep_update(dict_1[int(key)], value) return dict_1 elif type(dict_1) == type({}): for key, value in dict_2.items(): try: dict_1[key] = deep_update(dict_1[key], value) except KeyError: dict_1[key] = value return dict_1 else: return dict_2 dict_1 = {'1':'string', '2':[1, 2, 3, 4], '3':{'a':'aaa', 'b':'bbb'} } dict_2 = {'1':'strong', '2':{2:5}, '3':{'b':'bbbb', 'c':'ccc'}, '4':'tst'} print (deep_update(dict_1, dict_2))
Partager