Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- """
- Example with singledispatch and a little bit recursion
- """
- from functools import singledispatch
- from itertools import zip_longest
- from math import isclose
- from pprint import pprint
- def print_level_name(name, level):
- print(f'{"-" * level} {name.title()} Level: {level}')
- @singledispatch
- def compare(a, b, level=1):
- print_level_name('generic', level)
- return a == b
- @compare.register(int)
- @compare.register(float)
- def compare_float(a, b, level=1):
- print_level_name('sequence', level)
- return isclose(a,b)
- @compare.register(dict)
- def compare_dict(a, b, level=1):
- print_level_name('dict', level)
- if a.keys() ^ b.keys():
- return False
- for akey, avalue in a.items():
- bvalue = b.get(akey)
- if not compare(avalue, bvalue, level=level+1):
- return False
- return True
- @compare.register(list)
- @compare.register(tuple)
- def compare_sequence(a, b, level=1):
- print_level_name('sequence', level)
- for avalue, bvalue in zip_longest(a, b, fillvalue=...):
- if not compare(avalue, bvalue, level=level+1):
- return False
- return True
- @compare.register(frozenset)
- @compare.register(set)
- def compare_set(a, b, level=1):
- print_level_name('set', level)
- rest = sorted(a ^ b)
- if len(rest) % 2 != 0:
- return False
- while rest:
- val1 = rest.pop()
- val2 = rest.pop()
- if not compare(val1, val2, level=level+1):
- return False
- return True
- d1 = {
- 'color': 'red', 'id': 5, 'value': 10.0, 'sd': {
- 'value': 4.4, 'foo': [
- 1, 2, 3, [
- 4, {
- 0.1 + 0.2,
- }
- ]
- ]
- }
- }
- d2 = {
- 'color': 'red', 'id': 5, 'value': 10.0, 'sd': {
- 'value': 4.4, 'foo': [
- 1, 2, 3, [
- 4, {
- 0.3,
- }
- ]
- ]
- }
- }
- print('Input Data D1')
- pprint(d1)
- print()
- print('Input Data D2')
- pprint(d2)
- print()
- result = compare(d1, d2)
- if result:
- print('Both objects are equal')
- else:
- print('Objects are not equal')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement