Da anscheinend niemand erwähnt hat deepdiff
, werde ich es der Vollständigkeit halber hier hinzufügen. Ich finde es sehr praktisch, Diff von (verschachtelten) Objekten im Allgemeinen zu erhalten:
Installation
pip install deepdiff
Beispielcode
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))
Ausgabe
{
"values_changed": {
"root['a']": {
"new_value": 2,
"old_value": 1
},
"root['nested']['b']": {
"new_value": 2,
"old_value": 1
}
}
}
Hinweis zum hübschen Drucken des Ergebnisses zur Überprüfung: Der obige Code funktioniert, wenn beide Dikte dieselben Attributschlüssel haben (mit möglicherweise unterschiedlichen Attributwerten wie im Beispiel). Wenn jedoch ein "extra"
Attribut vorhanden ist, ist eines der Diktate, json.dumps()
schlägt mit fehl
TypeError: Object of type PrettyOrderedSet is not JSON serializable
Lösung: Verwenden diff.to_json()
und json.loads()
/ oder json.dumps()
hübsch drucken:
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))
Ausgabe:
{
"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: Verwendung pprint
führt zu einer anderen Formatierung:
import pprint
# same code as above
pprint.pprint(diff, indent=4)
Ausgabe:
{ '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
sollte laut stackoverflow.com/a/5635309/186202