pyhdf5_handler.src.object_handler

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