pyhdf5_handler.src.object_handler

  1from __future__ import annotations
  2
  3import numpy as np
  4import numbers
  5import pandas as pd
  6import datetime
  7
  8
  9def _isinstance_pandas(value):
 10    pandas_classes = [getattr(pd, item) for item in dir(pd) if isinstance(getattr(pd, item), type)]
 11    for cls in pandas_classes:
 12        if isinstance(value, cls):
 13            return True
 14    return False
 15
 16def _isinstance_numpy(value):
 17    numpy_classes = [getattr(np, item) for item in dir(np) if isinstance(getattr(np, item), type)]
 18    for cls in numpy_classes:
 19        if isinstance(value, cls):
 20            return True
 21    return False
 22
 23def _isinstance_datetime(value):
 24    datetime_classes = [getattr(datetime, item) for item in dir(datetime) if isinstance(getattr(datetime, item), type)]
 25    for cls in datetime_classes:
 26        if isinstance(value, cls):
 27            return True
 28    return False
 29
 30def generate_dict_structure(dictionary,recursion_counter=0,recursion_limit=100,include_method=True):
 31    """
 32    
 33    this function create a full dictionnary containing all the structure of an dictionnary in order to save it to an hdf5
 34
 35    Parameters
 36    ----------
 37    
 38    instance : python dictionary
 39        a custom dictionary.
 40    recursion_limit : int
 41        max recursion limit to dig inside `instance`
 42    recursion_counter: int
 43        current recursion value
 44    include_method: bool
 45        Include methods/functions in the object structure, if False, only data will be included.
 46
 47    Returns
 48    -------
 49    
 50    list or dict :
 51        A list or dictionary matching the structure of the python object.
 52    
 53    """
 54    key_data={}
 55    key_list = list()
 56    recursion_counter=0
 57    for attr,value in dictionary.items():
 58        
 59        try:
 60            if isinstance(value,dict):
 61                
 62                subkey_data=generate_dict_structure(value)
 63                if len(subkey_data)>0:
 64                    key_data.update({attr:subkey_data})
 65            
 66            elif isinstance(value, (list, tuple, numbers.Number, str)):
 67                key_list.append(attr)
 68            
 69            elif _isinstance_pandas(value):
 70                key_list.append(attr)
 71                
 72            elif _isinstance_datetime(value):
 73                key_list.append(attr)
 74                
 75            elif _isinstance_numpy(value):
 76                key_list.append(attr)
 77            
 78            elif type(value) == "method":
 79                if include_method:
 80                    key_list.append(attr)
 81                else:
 82                    next(attr)
 83            
 84            else:
 85                
 86                recursion_counter = recursion_counter+1
 87                
 88                if recursion_counter > recursion_limit:
 89                    print(f"recursion counter exceed the limit of {recursion_limit}... return")
 90                    return
 91                
 92                subkey_data = generate_object_structure(value,recursion_counter=recursion_counter,recursion_limit=recursion_limit,include_method=include_method)
 93                if len(subkey_data) > 0:
 94                    key_data.update({attr: subkey_data})
 95
 96        except:
 97            pass
 98    
 99    for attr, value in key_data.items():
100        key_list.append({attr: value})
101    
102    return key_list
103
104
105def generate_object_structure(instance,recursion_counter=0,recursion_limit=100,include_method=True):
106    """
107    
108    this function create a full dictionnary containing all the structure of an object in order to save it to an hdf5
109
110    Parameters
111    ----------
112    
113    instance : object
114        a custom python object.
115    recursion_limit : int
116        max recursion limit to dig inside `instance`
117    recursion_counter: int
118        current recursion value
119    include_method: bool
120        Include methods/functions in the object structure, if False, only data will be included.
121
122    Returns
123    -------
124    
125    list or dict :
126        A list or dictionary matching the structure of the python object.
127    
128    """
129    key_data = {}
130    key_list = list()
131    return_list = False
132    recursion_counter = 0
133    for attr in dir(instance):
134        
135        if not attr.startswith("_") and not attr in ["from_handle", "copy"]:
136            
137            try:
138                value = getattr(instance, attr)
139                
140                if isinstance(value, (list, tuple)):
141                    key_list.append(attr)
142                    return_list = True
143                
144                elif _isinstance_numpy(value):
145                    key_list.append(attr)
146                    return_list = True
147                
148                elif isinstance(value, dict):
149                    
150                    depp_key_data=generate_dict_structure(value)
151                    if len(depp_key_data) > 0:
152                        key_data.update({attr: depp_key_data})
153
154                elif isinstance(value, numbers.Number):
155                    key_list.append(attr)
156                    return_list = True
157
158                elif isinstance(value, str):
159                    key_list.append(attr)
160                    return_list = True
161
162                elif "<class 'method" in str(type(value)):
163                    if include_method:
164                        key_list.append(attr)
165                        return_list = True
166                    else:
167                        next(attr)
168                
169                elif _isinstance_pandas(value):
170                    key_list.append(attr)
171                    return_list = True
172                
173                elif _isinstance_datetime(value):
174                    key_list.append(attr)
175                    return_list = True
176                    
177                else:
178                    
179                    recursion_counter = recursion_counter+1
180                    
181                    if recursion_counter > recursion_limit:
182                        print(f"recursion counter exceed the limit of {recursion_limit}... return")
183                        return
184                    
185                    depp_key_data = generate_object_structure(value, recursion_counter=recursion_counter,recursion_limit=recursion_limit,include_method=include_method)
186
187                    if len(depp_key_data) > 0:
188                        key_data.update({attr: depp_key_data})
189
190            except:
191                # raise ValueError("unable to parse attr", attr)
192                # ~ print("unable to parse attr", attr, "skip it...")
193                pass
194
195    if return_list:
196        for attr, value in key_data.items():
197            key_list.append({attr: value})
198
199        return key_list
200
201    else:
202        return key_data
203
204
205def read_object_as_dict(instance, recursion_counter=0,recursion_limit=100):
206    """
207    
208    create a dictionary from a custom python object
209
210    Parameters
211    ----------
212    
213    instance : object
214        an custom python object
215    recursion_limit : int
216        max recursion limit to dig inside `instance`
217    recursion_counter: int
218        current recursion value
219
220    Return
221    ------
222    
223    key_data: dict
224        an dictionary containing all keys and atributes of the object
225    
226    """
227    key_data = {}
228    recursion_counter = 0
229    for attr in dir(instance):
230        #print(attr)
231        if not attr.startswith("_") and not attr in ["from_handle", "copy"]:
232            try:
233                value = getattr(instance, attr)
234                
235                if isinstance(value, (list, tuple)):
236                    
237                    if isinstance(value, list):
238                        value = np.array(value).astype('U')
239
240                    if value.dtype == "object" or value.dtype.char == "U":
241                        value = value.astype("U")
242                    
243                    key_data.update({attr: value})
244                
245                elif isinstance(value, dict):
246                    key_data.update({attr: value})
247                
248                elif isinstance(value, numbers.Number):
249                    key_data.update({attr: value})
250
251                elif isinstance(value, str):
252                    key_data.update({attr: value})
253
254                elif type(value) == "method":
255                    next(attr)
256                
257                elif _isinstance_pandas(value):
258                    if value.dtype == "object" or value.dtype.char == "U":
259                        value = value.astype("U")
260                    key_data.update({attr: value})
261                
262                elif _isinstance_datetime(value):
263                    if value.dtype == "object" or value.dtype.char == "U":
264                        value = value.astype("U")
265                    key_data.update({attr: value})
266                
267                elif _isinstance_numpy(value):
268                    if value.dtype == "object" or value.dtype.char == "U":
269                        value = value.astype("U")
270                    key_data.update({attr: value})
271
272                else:
273                    
274                    recursion_counter = recursion_counter+1
275                    
276                    if recursion_counter > recursion_limit:
277                        print(f"recursion counter exceed the limit of {recursion_limit}... return")
278                        return
279                    
280                    depp_key_data = read_object_as_dict(
281                        value, recursion_counter=recursion_counter,recursion_limit=recursion_limit)
282                    
283                    if len(depp_key_data) > 0:
284                        key_data.update({attr: depp_key_data})
285
286            except:
287                pass
288
289    return key_data
def generate_dict_structure( dictionary, recursion_counter=0, recursion_limit=100, include_method=True):
 32def generate_dict_structure(dictionary,recursion_counter=0,recursion_limit=100,include_method=True):
 33    """
 34    
 35    this function create a full dictionnary containing all the structure of an dictionnary in order to save it to an hdf5
 36
 37    Parameters
 38    ----------
 39    
 40    instance : python dictionary
 41        a custom dictionary.
 42    recursion_limit : int
 43        max recursion limit to dig inside `instance`
 44    recursion_counter: int
 45        current recursion value
 46    include_method: bool
 47        Include methods/functions in the object structure, if False, only data will be included.
 48
 49    Returns
 50    -------
 51    
 52    list or dict :
 53        A list or dictionary matching the structure of the python object.
 54    
 55    """
 56    key_data={}
 57    key_list = list()
 58    recursion_counter=0
 59    for attr,value in dictionary.items():
 60        
 61        try:
 62            if isinstance(value,dict):
 63                
 64                subkey_data=generate_dict_structure(value)
 65                if len(subkey_data)>0:
 66                    key_data.update({attr:subkey_data})
 67            
 68            elif isinstance(value, (list, tuple, numbers.Number, str)):
 69                key_list.append(attr)
 70            
 71            elif _isinstance_pandas(value):
 72                key_list.append(attr)
 73                
 74            elif _isinstance_datetime(value):
 75                key_list.append(attr)
 76                
 77            elif _isinstance_numpy(value):
 78                key_list.append(attr)
 79            
 80            elif type(value) == "method":
 81                if include_method:
 82                    key_list.append(attr)
 83                else:
 84                    next(attr)
 85            
 86            else:
 87                
 88                recursion_counter = recursion_counter+1
 89                
 90                if recursion_counter > recursion_limit:
 91                    print(f"recursion counter exceed the limit of {recursion_limit}... return")
 92                    return
 93                
 94                subkey_data = generate_object_structure(value,recursion_counter=recursion_counter,recursion_limit=recursion_limit,include_method=include_method)
 95                if len(subkey_data) > 0:
 96                    key_data.update({attr: subkey_data})
 97
 98        except:
 99            pass
100    
101    for attr, value in key_data.items():
102        key_list.append({attr: value})
103    
104    return key_list

this function create a full dictionnary containing all the structure of an dictionnary in order to save it to an hdf5

Parameters

instance : python dictionary a custom dictionary. recursion_limit : int max recursion limit to dig inside instance recursion_counter: int current recursion value include_method: bool Include methods/functions in the object structure, if False, only data will be included.

Returns

list or dict : A list or dictionary matching the structure of the python object.

def generate_object_structure( instance, recursion_counter=0, recursion_limit=100, include_method=True):
107def generate_object_structure(instance,recursion_counter=0,recursion_limit=100,include_method=True):
108    """
109    
110    this function create a full dictionnary containing all the structure of an object in order to save it to an hdf5
111
112    Parameters
113    ----------
114    
115    instance : object
116        a custom python object.
117    recursion_limit : int
118        max recursion limit to dig inside `instance`
119    recursion_counter: int
120        current recursion value
121    include_method: bool
122        Include methods/functions in the object structure, if False, only data will be included.
123
124    Returns
125    -------
126    
127    list or dict :
128        A list or dictionary matching the structure of the python object.
129    
130    """
131    key_data = {}
132    key_list = list()
133    return_list = False
134    recursion_counter = 0
135    for attr in dir(instance):
136        
137        if not attr.startswith("_") and not attr in ["from_handle", "copy"]:
138            
139            try:
140                value = getattr(instance, attr)
141                
142                if isinstance(value, (list, tuple)):
143                    key_list.append(attr)
144                    return_list = True
145                
146                elif _isinstance_numpy(value):
147                    key_list.append(attr)
148                    return_list = True
149                
150                elif isinstance(value, dict):
151                    
152                    depp_key_data=generate_dict_structure(value)
153                    if len(depp_key_data) > 0:
154                        key_data.update({attr: depp_key_data})
155
156                elif isinstance(value, numbers.Number):
157                    key_list.append(attr)
158                    return_list = True
159
160                elif isinstance(value, str):
161                    key_list.append(attr)
162                    return_list = True
163
164                elif "<class 'method" in str(type(value)):
165                    if include_method:
166                        key_list.append(attr)
167                        return_list = True
168                    else:
169                        next(attr)
170                
171                elif _isinstance_pandas(value):
172                    key_list.append(attr)
173                    return_list = True
174                
175                elif _isinstance_datetime(value):
176                    key_list.append(attr)
177                    return_list = True
178                    
179                else:
180                    
181                    recursion_counter = recursion_counter+1
182                    
183                    if recursion_counter > recursion_limit:
184                        print(f"recursion counter exceed the limit of {recursion_limit}... return")
185                        return
186                    
187                    depp_key_data = generate_object_structure(value, recursion_counter=recursion_counter,recursion_limit=recursion_limit,include_method=include_method)
188
189                    if len(depp_key_data) > 0:
190                        key_data.update({attr: depp_key_data})
191
192            except:
193                # raise ValueError("unable to parse attr", attr)
194                # ~ print("unable to parse attr", attr, "skip it...")
195                pass
196
197    if return_list:
198        for attr, value in key_data.items():
199            key_list.append({attr: value})
200
201        return key_list
202
203    else:
204        return key_data

this function create a full dictionnary containing all the structure of an object in order to save it to an hdf5

Parameters

instance : object a custom python object. recursion_limit : int max recursion limit to dig inside instance recursion_counter: int current recursion value include_method: bool Include methods/functions in the object structure, if False, only data will be included.

Returns

list or dict : A list or dictionary matching the structure of the python object.

def read_object_as_dict(instance, recursion_counter=0, recursion_limit=100):
207def read_object_as_dict(instance, recursion_counter=0,recursion_limit=100):
208    """
209    
210    create a dictionary from a custom python object
211
212    Parameters
213    ----------
214    
215    instance : object
216        an custom python object
217    recursion_limit : int
218        max recursion limit to dig inside `instance`
219    recursion_counter: int
220        current recursion value
221
222    Return
223    ------
224    
225    key_data: dict
226        an dictionary containing all keys and atributes of the object
227    
228    """
229    key_data = {}
230    recursion_counter = 0
231    for attr in dir(instance):
232        #print(attr)
233        if not attr.startswith("_") and not attr in ["from_handle", "copy"]:
234            try:
235                value = getattr(instance, attr)
236                
237                if isinstance(value, (list, tuple)):
238                    
239                    if isinstance(value, list):
240                        value = np.array(value).astype('U')
241
242                    if value.dtype == "object" or value.dtype.char == "U":
243                        value = value.astype("U")
244                    
245                    key_data.update({attr: value})
246                
247                elif isinstance(value, dict):
248                    key_data.update({attr: value})
249                
250                elif isinstance(value, numbers.Number):
251                    key_data.update({attr: value})
252
253                elif isinstance(value, str):
254                    key_data.update({attr: value})
255
256                elif type(value) == "method":
257                    next(attr)
258                
259                elif _isinstance_pandas(value):
260                    if value.dtype == "object" or value.dtype.char == "U":
261                        value = value.astype("U")
262                    key_data.update({attr: value})
263                
264                elif _isinstance_datetime(value):
265                    if value.dtype == "object" or value.dtype.char == "U":
266                        value = value.astype("U")
267                    key_data.update({attr: value})
268                
269                elif _isinstance_numpy(value):
270                    if value.dtype == "object" or value.dtype.char == "U":
271                        value = value.astype("U")
272                    key_data.update({attr: value})
273
274                else:
275                    
276                    recursion_counter = recursion_counter+1
277                    
278                    if recursion_counter > recursion_limit:
279                        print(f"recursion counter exceed the limit of {recursion_limit}... return")
280                        return
281                    
282                    depp_key_data = read_object_as_dict(
283                        value, recursion_counter=recursion_counter,recursion_limit=recursion_limit)
284                    
285                    if len(depp_key_data) > 0:
286                        key_data.update({attr: depp_key_data})
287
288            except:
289                pass
290
291    return key_data

create a dictionary from a custom python object

Parameters

instance : object an custom python object recursion_limit : int max recursion limit to dig inside instance recursion_counter: int current recursion value

Return

key_data: dict an dictionary containing all keys and atributes of the object