|
13 | 13 | from math import isclose as is_close |
14 | 14 | from collections.abc import Mapping, Iterable, Sequence |
15 | 15 | from collections import defaultdict |
| 16 | +from inspect import getmembers |
16 | 17 | from itertools import zip_longest |
17 | 18 | from ordered_set import OrderedSet |
18 | 19 | from deepdiff.helper import (strings, bytes_type, numbers, uuids, datetimes, ListItemRemovedOrAdded, notpresent, |
@@ -417,20 +418,25 @@ def _diff_enum(self, level, parents_ids=frozenset(), local_tree=None): |
417 | 418 |
|
418 | 419 | def _diff_obj(self, level, parents_ids=frozenset(), is_namedtuple=False, local_tree=None): |
419 | 420 | """Difference of 2 objects""" |
| 421 | + processing_error = False |
420 | 422 | try: |
421 | 423 | if is_namedtuple: |
422 | 424 | t1 = level.t1._asdict() |
423 | 425 | t2 = level.t2._asdict() |
424 | | - else: |
| 426 | + elif all('__dict__' in dir(t) for t in level): |
425 | 427 | t1 = detailed__dict__(level.t1, ignore_private_variables=self.ignore_private_variables) |
426 | 428 | t2 = detailed__dict__(level.t2, ignore_private_variables=self.ignore_private_variables) |
427 | | - except AttributeError: |
428 | | - try: |
| 429 | + elif all('__slots__' in dir(t) for t in level): |
429 | 430 | t1 = self._dict_from_slots(level.t1) |
430 | 431 | t2 = self._dict_from_slots(level.t2) |
431 | | - except AttributeError: |
432 | | - self._report_result('unprocessed', level, local_tree=local_tree) |
433 | | - return |
| 432 | + else: |
| 433 | + t1 = {k: v for k, v in getmembers(level.t1) if not callable(v)} |
| 434 | + t2 = {k: v for k, v in getmembers(level.t2) if not callable(v)} |
| 435 | + except AttributeError: |
| 436 | + processing_error = True |
| 437 | + if processing_error is True: |
| 438 | + self._report_result('unprocessed', level, local_tree=local_tree) |
| 439 | + return |
434 | 440 |
|
435 | 441 | self._diff_dict( |
436 | 442 | level, |
@@ -876,7 +882,8 @@ def _diff_by_forming_pairs_and_comparing_one_by_one( |
876 | 882 | x, |
877 | 883 | y, |
878 | 884 | child_relationship_class=child_relationship_class, |
879 | | - child_relationship_param=j) |
| 885 | + child_relationship_param=j |
| 886 | + ) |
880 | 887 | self._diff(next_level, parents_ids_added, local_tree=local_tree) |
881 | 888 |
|
882 | 889 | def _diff_ordered_iterable_by_difflib( |
@@ -1529,7 +1536,7 @@ def _diff(self, level, parents_ids=frozenset(), _original_type=None, local_tree= |
1529 | 1536 | if isinstance(level.t1, booleans): |
1530 | 1537 | self._diff_booleans(level, local_tree=local_tree) |
1531 | 1538 |
|
1532 | | - if isinstance(level.t1, strings): |
| 1539 | + elif isinstance(level.t1, strings): |
1533 | 1540 | self._diff_str(level, local_tree=local_tree) |
1534 | 1541 |
|
1535 | 1542 | elif isinstance(level.t1, datetimes): |
|
0 commit comments