DeaD_EyE

singledispatch, recursion, isclose

Oct 26th, 2019
149
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/python3
  2. """
  3. Example with singledispatch and a little bit recursion
  4. """
  5.  
  6. from functools import singledispatch
  7. from itertools import zip_longest
  8. from math import isclose
  9. from pprint import pprint
  10.  
  11.  
  12. def print_level_name(name, level):
  13.     print(f'{"-" * level} {name.title()} Level: {level}')
  14.  
  15.  
  16. @singledispatch
  17. def compare(a, b, level=1):
  18.     print_level_name('generic', level)
  19.     return a == b
  20.  
  21.  
  22. @compare.register(int)
  23. @compare.register(float)
  24. def compare_float(a, b, level=1):
  25.     print_level_name('sequence', level)
  26.     return isclose(a,b)
  27.  
  28.  
  29. @compare.register(dict)
  30. def compare_dict(a, b, level=1):
  31.     print_level_name('dict', level)
  32.     if a.keys() ^ b.keys():
  33.         return False
  34.     for akey, avalue in a.items():
  35.         bvalue = b.get(akey)
  36.         if not compare(avalue, bvalue, level=level+1):
  37.             return False
  38.     return True
  39.  
  40.  
  41. @compare.register(list)
  42. @compare.register(tuple)
  43. def compare_sequence(a, b, level=1):
  44.     print_level_name('sequence', level)
  45.     for avalue, bvalue in zip_longest(a, b, fillvalue=...):
  46.         if not compare(avalue, bvalue, level=level+1):
  47.             return False
  48.     return True
  49.  
  50.  
  51. @compare.register(frozenset)
  52. @compare.register(set)
  53. def compare_set(a, b, level=1):
  54.     print_level_name('set', level)
  55.     rest = sorted(a ^ b)
  56.     if len(rest) % 2 != 0:
  57.         return False
  58.     while rest:
  59.         val1 = rest.pop()
  60.         val2 = rest.pop()
  61.         if not compare(val1, val2, level=level+1):
  62.             return False
  63.     return True
  64.  
  65.  
  66. d1 = {
  67.     'color': 'red', 'id': 5, 'value': 10.0, 'sd': {
  68.         'value': 4.4, 'foo': [
  69.             1, 2, 3, [
  70.                 4, {
  71.                     0.1 + 0.2,
  72.                     }
  73.                 ]
  74.             ]
  75.         }
  76.      }
  77.  
  78. d2 = {
  79.     'color': 'red', 'id': 5, 'value': 10.0, 'sd': {
  80.         'value': 4.4, 'foo': [
  81.             1, 2, 3, [
  82.                 4, {
  83.                     0.3,
  84.                     }
  85.                 ]
  86.             ]
  87.         }
  88.      }
  89.  
  90. print('Input Data D1')
  91. pprint(d1)
  92. print()
  93. print('Input Data D2')
  94. pprint(d2)
  95. print()
  96. result = compare(d1, d2)
  97. if result:
  98.     print('Both objects are equal')
  99. else:
  100.     print('Objects are not equal')
RAW Paste Data