Puisqu'il semble que personne n'a mentionné deepdiff
, je vais l'ajouter ici pour être complet. Je trouve cela très pratique pour obtenir des objets différents (imbriqués) en général:
Installation
pip install deepdiff
Exemple de code
import deepdiff
import json
dict_1 = {
"a": 1,
"nested": {
"b": 1,
}
}
dict_2 = {
"a": 2,
"nested": {
"b": 2,
}
}
diff = deepdiff.DeepDiff(dict_1, dict_2)
print(json.dumps(diff, indent=4))
Production
{
"values_changed": {
"root['a']": {
"new_value": 2,
"old_value": 1
},
"root['nested']['b']": {
"new_value": 2,
"old_value": 1
}
}
}
Remarque sur l'impression du résultat pour inspection: le code ci-dessus fonctionne si les deux dict ont les mêmes clés d'attribut (avec éventuellement des valeurs d'attribut différentes comme dans l'exemple). Cependant, si un "extra"
attribut est présent est l'un des dict, json.dumps()
échoue avec
TypeError: Object of type PrettyOrderedSet is not JSON serializable
Solution: utilisez diff.to_json()
et json.loads()
/ json.dumps()
pour joliment imprimer:
import deepdiff
import json
dict_1 = {
"a": 1,
"nested": {
"b": 1,
},
"extra": 3
}
dict_2 = {
"a": 2,
"nested": {
"b": 2,
}
}
diff = deepdiff.DeepDiff(dict_1, dict_2)
print(json.dumps(json.loads(diff.to_json()), indent=4))
Production:
{
"dictionary_item_removed": [
"root['extra']"
],
"values_changed": {
"root['a']": {
"new_value": 2,
"old_value": 1
},
"root['nested']['b']": {
"new_value": 2,
"old_value": 1
}
}
}
Alternative: utilisation pprint
, entraîne une mise en forme différente:
import pprint
# same code as above
pprint.pprint(diff, indent=4)
Production:
{ 'dictionary_item_removed': [root['extra']],
'values_changed': { "root['a']": { 'new_value': 2,
'old_value': 1},
"root['nested']['b']": { 'new_value': 2,
'old_value': 1}}}
x == y
devrait être vrai selon stackoverflow.com/a/5635309/186202