Skip to content

Commit 945a69d

Browse files
committed
better support of private variables
1 parent de3f105 commit 945a69d

File tree

4 files changed

+102
-5
lines changed

4 files changed

+102
-5
lines changed

deepdiff/diff.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,8 +394,8 @@ def _diff_obj(self, level, parents_ids=frozenset(),
394394
t1 = level.t1._asdict()
395395
t2 = level.t2._asdict()
396396
else:
397-
t1 = detailed__dict__(level.t1)
398-
t2 = detailed__dict__(level.t2)
397+
t1 = detailed__dict__(level.t1, ignore_private_variables=self.ignore_private_variables)
398+
t2 = detailed__dict__(level.t2, ignore_private_variables=self.ignore_private_variables)
399399
except AttributeError:
400400
try:
401401
t1 = self._dict_from_slots(level.t1)

deepdiff/helper.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,10 +591,11 @@ def detailed__dict__(obj, ignore_private_variables=True):
591591
This is used so we retrieve object properties too.
592592
"""
593593
result = obj.__dict__.copy() # A shallow copy
594+
private_var_prefix = f"_{obj.__class__.__name__}__" # The semi private variables in Python get this prefix
594595
for key in dir(obj):
595596
if key not in result and (
596597
not ignore_private_variables or (
597-
ignore_private_variables and not key.startswith('__')
598+
ignore_private_variables and not key.startswith('__') and not key.startswith(private_var_prefix)
598599
)
599600
):
600601
value = getattr(obj, key)

tests/test_diff_text.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1617,8 +1617,43 @@ def thing(self):
16171617
A._thing += 1
16181618
return A._thing
16191619

1620+
@property
1621+
def __thing2(self):
1622+
A._thing += 1
1623+
return A._thing
1624+
16201625
diff = DeepDiff(A(1), A(1))
1621-
expected = {'values_changed': {'root._thing': {'new_value': 1, 'old_value': 0},
1622-
'root.thing': {'new_value': 2, 'old_value': 1}}}
1626+
expected = {
1627+
'values_changed': {
1628+
'root._thing': {
1629+
'new_value': 1,
1630+
'old_value': 0
1631+
},
1632+
'root.thing': {
1633+
'new_value': 2,
1634+
'old_value': 1
1635+
}
1636+
}
1637+
}
16231638

16241639
assert expected == diff
1640+
1641+
diff2 = DeepDiff(A(1), A(1), ignore_private_variables=False)
1642+
expected2 = {
1643+
'values_changed': {
1644+
'root._A__thing2': {
1645+
'new_value': 5,
1646+
'old_value': 3
1647+
},
1648+
'root._thing': {
1649+
'new_value': 5,
1650+
'old_value': 3
1651+
},
1652+
'root.thing': {
1653+
'new_value': 6,
1654+
'old_value': 4
1655+
}
1656+
}
1657+
}
1658+
1659+
assert expected2 == diff2

tests/test_ignore_order.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,67 @@ def test_ignore_order_and_group_by3(self):
823823
diff = DeepDiff(t1, t2, group_by='id', ignore_order=True)
824824
assert {} == diff
825825

826+
def test_ignore_order_and_group_by4(self):
827+
t1 = [
828+
{
829+
"id": "1",
830+
"field_01": {
831+
"subfield_01": {
832+
"subfield_02": {"subfield_03": "1"},
833+
}
834+
},
835+
},
836+
{"id": "2", "field_01": ["1", "2", "3"]},
837+
{"id": "3", "field_01": ["1", "2", "3"]},
838+
]
839+
t2 = [
840+
{
841+
"id": "1",
842+
"field_01": {
843+
"subfield_01": {
844+
"subfield_02": {"subfield_03": "2"},
845+
}
846+
},
847+
},
848+
{"id": "2", "field_01": ["4", "5", "6"]},
849+
{"id": "3", "field_01": ["7", "8", "9"]},
850+
]
851+
diff = DeepDiff(t1, t2, group_by='id', ignore_order=True)
852+
expected = {
853+
'values_changed': {
854+
"root['1']['field_01']['subfield_01']['subfield_02']['subfield_03']": {
855+
'new_value': '2',
856+
'old_value': '1'
857+
},
858+
"root['2']['field_01'][1]": {
859+
'new_value': '5',
860+
'old_value': '2'
861+
},
862+
"root['3']['field_01'][2]": {
863+
'new_value': '9',
864+
'old_value': '3'
865+
},
866+
"root['2']['field_01'][0]": {
867+
'new_value': '4',
868+
'old_value': '1'
869+
},
870+
"root['3']['field_01'][1]": {
871+
'new_value': '8',
872+
'old_value': '2'
873+
},
874+
"root['3']['field_01'][0]": {
875+
'new_value': '7',
876+
'old_value': '1'
877+
},
878+
"root['2']['field_01'][2]": {
879+
'new_value': '6',
880+
'old_value': '3'
881+
}
882+
}
883+
}
884+
885+
assert expected == diff
886+
826887

827888
class TestCompareFuncIgnoreOrder:
828889

0 commit comments

Comments
 (0)