F.A.Q¶
Note
📣 Please fill out our fast 5-question survey so that we can learn how & why you use DeepDiff, and what improvements we should make. Thank you! 👯
Q: DeepDiff report is not precise when ignore_order=True¶
>>> from deepdiff import DeepDiff
>>> from pprint import pprint
>>> t1 = [
... {
... "key": "some/pathto/customers/foo/",
... "flags": 0,
... "value": ""
... },
... {
... "key": "some/pathto/customers/foo/account_number",
... "flags": 0,
... "value": "somevalue1"
... }
... ]
>>>
>>> t2 = [
... {
... "key": "some/pathto/customers/foo/account_number",
... "flags": 0,
... "value": "somevalue2"
... },
... {
... "key": "some/pathto/customers/foo/",
... "flags": 0,
... "value": "new"
... }
... ]
>>>
>>> pprint(DeepDiff(t1, t2))
{'values_changed': {"root[0]['key']": {'new_value': 'some/pathto/customers/foo/account_number',
'old_value': 'some/pathto/customers/foo/'},
"root[0]['value']": {'new_value': 'somevalue2',
'old_value': ''},
"root[1]['key']": {'new_value': 'some/pathto/customers/foo/',
'old_value': 'some/pathto/customers/foo/account_number'},
"root[1]['value']": {'new_value': 'new',
'old_value': 'somevalue1'}}}
Answer
This is explained in Cutoff Distance For Pairs and Cutoff Intersection For Pairs
Bump up these 2 parameters to 1 and you get what you want:
>>> pprint(DeepDiff(t1, t2, ignore_order=True, cutoff_distance_for_pairs=1, cutoff_intersection_for_pairs=1))
{'values_changed': {"root[0]['value']": {'new_value': 'new', 'old_value': ''},
"root[1]['value']": {'new_value': 'somevalue2',
'old_value': 'somevalue1'}}}
Q: TypeError: Object of type type is not JSON serializable¶
I’m trying to serialize the DeepDiff results into json and I’m getting the TypeError.
>>> diff=DeepDiff(1, "a")
>>> diff
{'type_changes': {'root': {'old_type': <class 'int'>, 'new_type': <class 'str'>, 'old_value': 1, 'new_value': 'a'}}}
>>> json.dumps(diff)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ".../json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File ".../json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File ".../json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File ".../json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type type is not JSON serializable
Answer
In order to serialize DeepDiff results into json, use to_json()
>>> diff.to_json()
'{"type_changes": {"root": {"old_type": "int", "new_type": "str", "old_value": 1, "new_value": "a"}}}'
Q: How do I parse DeepDiff result paths?¶
Answer
Use parse_path:
>>> from deepdiff import parse_path
>>> parse_path("root[1][2]['age']")
[1, 2, 'age']
>>> parse_path("root[1][2]['age']", include_actions=True)
[{'element': 1, 'action': 'GET'}, {'element': 2, 'action': 'GET'}, {'element': 'age', 'action': 'GET'}]
>>>
>>> parse_path("root['joe'].age")
['joe', 'age']
>>> parse_path("root['joe'].age", include_actions=True)
[{'element': 'joe', 'action': 'GET'}, {'element': 'age', 'action': 'GETATTR'}]
Back to DeepDiff 6.5.0 documentation!