|
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, |
@@ -415,20 +416,25 @@ def _diff_enum(self, level, parents_ids=frozenset(), local_tree=None): |
415 | 416 |
|
416 | 417 | def _diff_obj(self, level, parents_ids=frozenset(), is_namedtuple=False, local_tree=None): |
417 | 418 | """Difference of 2 objects""" |
| 419 | + processing_error = False |
418 | 420 | try: |
419 | 421 | if is_namedtuple: |
420 | 422 | t1 = level.t1._asdict() |
421 | 423 | t2 = level.t2._asdict() |
422 | | - else: |
| 424 | + elif all('__dict__' in dir(t) for t in level): |
423 | 425 | t1 = detailed__dict__(level.t1, ignore_private_variables=self.ignore_private_variables) |
424 | 426 | t2 = detailed__dict__(level.t2, ignore_private_variables=self.ignore_private_variables) |
425 | | - except AttributeError: |
426 | | - try: |
| 427 | + elif all('__slots__' in dir(t) for t in level): |
427 | 428 | t1 = self._dict_from_slots(level.t1) |
428 | 429 | t2 = self._dict_from_slots(level.t2) |
429 | | - except AttributeError: |
430 | | - self._report_result('unprocessed', level, local_tree=local_tree) |
431 | | - return |
| 430 | + else: |
| 431 | + t1 = {k: v for k, v in getmembers(level.t1) if not callable(v)} |
| 432 | + t2 = {k: v for k, v in getmembers(level.t2) if not callable(v)} |
| 433 | + except AttributeError: |
| 434 | + processing_error = True |
| 435 | + if processing_error is True: |
| 436 | + self._report_result('unprocessed', level, local_tree=local_tree) |
| 437 | + return |
432 | 438 |
|
433 | 439 | self._diff_dict( |
434 | 440 | level, |
@@ -874,7 +880,8 @@ def _diff_by_forming_pairs_and_comparing_one_by_one( |
874 | 880 | x, |
875 | 881 | y, |
876 | 882 | child_relationship_class=child_relationship_class, |
877 | | - child_relationship_param=j) |
| 883 | + child_relationship_param=j |
| 884 | + ) |
878 | 885 | self._diff(next_level, parents_ids_added, local_tree=local_tree) |
879 | 886 |
|
880 | 887 | def _diff_ordered_iterable_by_difflib( |
@@ -1527,7 +1534,7 @@ def _diff(self, level, parents_ids=frozenset(), _original_type=None, local_tree= |
1527 | 1534 | if isinstance(level.t1, booleans): |
1528 | 1535 | self._diff_booleans(level, local_tree=local_tree) |
1529 | 1536 |
|
1530 | | - if isinstance(level.t1, strings): |
| 1537 | + elif isinstance(level.t1, strings): |
1531 | 1538 | self._diff_str(level, local_tree=local_tree) |
1532 | 1539 |
|
1533 | 1540 | elif isinstance(level.t1, datetimes): |
|
0 commit comments