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