Vì dường như không ai nhắc đến deepdiff
, tôi sẽ thêm nó vào đây cho đầy đủ. Tôi thấy nó rất thuận tiện để nhận khác biệt của các đối tượng (lồng nhau) nói chung:
Cài đặt
pip install deepdiff
Mã mẫu
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))
Đầu ra
{
"values_changed": {
"root['a']": {
"new_value": 2,
"old_value": 1
},
"root['nested']['b']": {
"new_value": 2,
"old_value": 1
}
}
}
Lưu ý về việc in đẹp kết quả để kiểm tra: Đoạn mã trên hoạt động nếu cả hai ký tự có cùng khóa thuộc tính (với các giá trị thuộc tính có thể khác nhau như trong ví dụ). Tuy nhiên, nếu một "extra"
thuộc tính có mặt là một trong những dấu hiệu, thì json.dumps()
thất bại với
TypeError: Object of type PrettyOrderedSet is not JSON serializable
Giải pháp: sử dụng diff.to_json()
và json.loads()
/ json.dumps()
để in đẹp:
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))
Đầu ra:
{
"dictionary_item_removed": [
"root['extra']"
],
"values_changed": {
"root['a']": {
"new_value": 2,
"old_value": 1
},
"root['nested']['b']": {
"new_value": 2,
"old_value": 1
}
}
}
Thay thế: sử dụng pprint
, kết quả trong một định dạng khác nhau:
import pprint
# same code as above
pprint.pprint(diff, indent=4)
Đầu ra:
{ '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
phải đúng theo stackoverflow.com/a/5635309/186202