Added nested_mapping.py to map arbitrary nested data sets
This commit is contained in:
parent
161f48472a
commit
f937eaefac
89
nested_mapping.py
Normal file
89
nested_mapping.py
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
from collections import Iterable
|
||||
|
||||
|
||||
def unique(seq):
|
||||
"""Return a new sequence made of unique elements from seq."""
|
||||
uniques = []
|
||||
[uniques.append(x) for x in seq if not uniques.count(x)]
|
||||
return type(seq)(uniques)
|
||||
|
||||
|
||||
class StrType:
|
||||
"""Helper class to print and compare object types.
|
||||
__eq__ implemented to allow for StrType enumaration
|
||||
__hash__ implemented for compatibility with set objects
|
||||
__repr__ and __str__ to print type(StrType.obj) as desired.
|
||||
"""
|
||||
|
||||
def __init__(self, obj):
|
||||
"""Provide the object whose type you want to print."""
|
||||
self.obj = obj
|
||||
|
||||
def __eq__(self, other):
|
||||
if not isinstance(other, StrType):
|
||||
return False
|
||||
return type(self.obj) == type(other.obj)
|
||||
|
||||
def __hash__(self):
|
||||
return hash(str(self))
|
||||
|
||||
def __str__(self):
|
||||
return f"<{type(self.obj).__name__}>"
|
||||
|
||||
def __repr__(self):
|
||||
return self.__str__()
|
||||
|
||||
|
||||
def get_structure(data):
|
||||
"""Return a kind of map of the could-be nested data.
|
||||
Duplicates are removed from sequences.
|
||||
"""
|
||||
if isinstance(data, dict):
|
||||
return {key:get_structure(value) for key, value in data.items()}
|
||||
elif (isinstance(data, Iterable)
|
||||
and not isinstance(data, str)
|
||||
and not isinstance(data, bytes)):
|
||||
if data:
|
||||
return unique(type(data)([get_structure(item) for item in data]))
|
||||
return StrType(data)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from pprint import pprint
|
||||
from datetime import datetime
|
||||
|
||||
class MaClasse:
|
||||
pass
|
||||
|
||||
nested = {'some types': {'MaClasse': MaClasse(),
|
||||
'datetime': datetime.now(),
|
||||
'empty-list': [],
|
||||
'empty-tuple': (),
|
||||
'float': 3.14,
|
||||
'int': 0,
|
||||
'list': [False,],
|
||||
'set': {'a',},
|
||||
'str': 'Babylone',
|
||||
'tuple': ('jah',)},
|
||||
'sequence types': {'lists': ['a', 'b', 'c',
|
||||
datetime.now(),
|
||||
[1, 2, 3],
|
||||
[1, 2, 3]],
|
||||
'tuples': ('a', 'b', 'c',
|
||||
datetime.now(),
|
||||
[1, 2, 3],
|
||||
[1, 2, 3]),
|
||||
'sets': {'hello', 'world', 42, True}},
|
||||
'2 same dict 1 other': [{'same':3, 'as':b'the other'},
|
||||
{'same':3, 'as':b'the other'},
|
||||
{'different':'from','the':'other'}],
|
||||
'play me': MaClasse}
|
||||
|
||||
structure = get_structure(nested)
|
||||
|
||||
print("The nested data:")
|
||||
pprint(nested)
|
||||
|
||||
print("")
|
||||
print("Its mapping:")
|
||||
pprint(structure)
|
||||
Loading…
Reference in a new issue