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
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.
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.
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