115 |
125 |
116 if "(ID:" not in attribute: |
126 if "(ID:" not in attribute: |
117 try: |
127 try: |
118 return var[attribute] |
128 return var[attribute] |
119 except Exception: |
129 except Exception: |
120 return getattr(var, attribute) |
130 return getattr(var, attribute, None) |
121 |
131 |
122 expectedID = int(attribute.split("(ID:")[-1][:-1]) |
132 expectedID = int(attribute.split("(ID:")[-1][:-1]) |
123 for key, value in var.items(): |
133 for key, value in var.items(): |
124 if id(key) == expectedID: |
134 if id(key) == expectedID: |
125 return value |
135 return value |
126 |
136 |
127 return None |
137 return None |
128 |
138 |
129 def __keyToStr(self, key): |
139 def keyToStr(self, key): |
130 """ |
140 """ |
131 Private method to get a string representation for a key. |
141 Public method to get a string representation for a key. |
132 |
142 |
133 @param key key to be converted |
143 @param key key to be converted |
134 @type any |
144 @type any |
135 @return string representation of the given key |
145 @return string representation of the given key |
136 @rtype str |
146 @rtype str |
274 d.update(additionals) |
294 d.update(additionals) |
275 |
295 |
276 return d |
296 return d |
277 |
297 |
278 |
298 |
|
299 ############################################################ |
|
300 ## Resolver for Numpy Arrays |
|
301 ############################################################ |
|
302 |
|
303 |
|
304 class NdArrayResolver(BaseResolver): |
|
305 """ |
|
306 Class used to resolve from numpy ndarray including some meta data. |
|
307 """ |
|
308 def __isNumeric(self, arr): |
|
309 """ |
|
310 Private method to check, if an array is of a numeric type. |
|
311 |
|
312 @param arr array to check |
|
313 @type ndarray |
|
314 @return flag indicating a numeric array |
|
315 @rtype bool |
|
316 """ |
|
317 try: |
|
318 return arr.dtype.kind in 'biufc' |
|
319 except AttributeError: |
|
320 return False |
|
321 |
|
322 def resolve(self, var, attribute): |
|
323 """ |
|
324 Public method to get an attribute from a variable. |
|
325 |
|
326 @param var variable to extract an attribute or value from |
|
327 @type tuple or list |
|
328 @param attribute id of the value to extract |
|
329 @type str |
|
330 @return value of the attribute |
|
331 @rtype any |
|
332 """ |
|
333 if attribute == '__internals__': |
|
334 return defaultResolver.getDictionary(var) |
|
335 |
|
336 if attribute == 'min': |
|
337 if self.__isNumeric(var): |
|
338 return var.min() |
|
339 else: |
|
340 return None |
|
341 |
|
342 if attribute == 'max': |
|
343 if self.__isNumeric(var): |
|
344 return var.max() |
|
345 else: |
|
346 return None |
|
347 |
|
348 if attribute == 'mean': |
|
349 if self.__isNumeric(var): |
|
350 return var.mean() |
|
351 else: |
|
352 return None |
|
353 |
|
354 if attribute == 'shape': |
|
355 return var.shape |
|
356 |
|
357 if attribute == 'dtype': |
|
358 return var.dtype |
|
359 |
|
360 if attribute == 'size': |
|
361 return var.size |
|
362 |
|
363 if attribute.startswith('['): |
|
364 container = NdArrayItemsContainer() |
|
365 count = 0 |
|
366 for element in var: |
|
367 setattr(container, str(count), element) |
|
368 count += 1 |
|
369 if count > MaxItemsToHandle: |
|
370 setattr(container, TooLargeAttribute, TooLargeMessage) |
|
371 break |
|
372 return container |
|
373 |
|
374 return None |
|
375 |
|
376 def getDictionary(self, var): |
|
377 """ |
|
378 Public method to get the attributes of a variable as a dictionary. |
|
379 |
|
380 @param var variable to be converted |
|
381 @type any |
|
382 @return dictionary containing the variable attributes |
|
383 @rtype dict |
|
384 """ |
|
385 d = {} |
|
386 d['__internals__'] = defaultResolver.getDictionary(var) |
|
387 if var.size > 1024 * 1024: |
|
388 d['min'] = 'ndarray too big, calculating min would slow down' \ |
|
389 ' debugging' |
|
390 d['max'] = 'ndarray too big, calculating max would slow down' \ |
|
391 ' debugging' |
|
392 else: |
|
393 if self.__isNumeric(var): |
|
394 d['min'] = var.min() |
|
395 d['max'] = var.max() |
|
396 d['mean'] = var.mean() |
|
397 else: |
|
398 d['min'] = 'not a numeric object' |
|
399 d['max'] = 'not a numeric object' |
|
400 d['mean'] = 'not a numeric object' |
|
401 d['shape'] = var.shape |
|
402 d['dtype'] = var.dtype |
|
403 d['size'] = var.size |
|
404 d['[0:{0}]'.format(len(var) - 1)] = list(var[0:MaxItemsToHandle]) |
|
405 return d |
|
406 |
|
407 |
|
408 class NdArrayItemsContainer: |
|
409 """ |
|
410 Class to store ndarray items. |
|
411 """ |
|
412 pass |
|
413 |
|
414 |
|
415 ############################################################ |
|
416 ## Resolver for Django Multi Value Dictionaries |
|
417 ############################################################ |
|
418 |
|
419 |
|
420 class MultiValueDictResolver(DictResolver): |
|
421 """ |
|
422 Class used to resolve from Django multi value dictionaries. |
|
423 """ |
|
424 def resolve(self, var, attribute): |
|
425 """ |
|
426 Public method to get an attribute from a variable. |
|
427 |
|
428 @param var variable to extract an attribute or value from |
|
429 @type dict |
|
430 @param attribute name of the attribute to extract |
|
431 @type str |
|
432 @return value of the attribute |
|
433 @rtype any |
|
434 """ |
|
435 if attribute in ('___len___', TooLargeAttribute): |
|
436 return None |
|
437 |
|
438 if "(ID:" not in attribute: |
|
439 try: |
|
440 return var[attribute] |
|
441 except Exception: |
|
442 return getattr(var, attribute, None) |
|
443 |
|
444 expectedID = int(attribute.split("(ID:")[-1][:-1]) |
|
445 for key in var.keys(): |
|
446 if id(key) == expectedID: |
|
447 value = var.getlist(key) |
|
448 return value |
|
449 |
|
450 return None |
|
451 |
|
452 def getDictionary(self, var): |
|
453 """ |
|
454 Public method to get the attributes of a variable as a dictionary. |
|
455 |
|
456 @param var variable to be converted |
|
457 @type any |
|
458 @return dictionary containing the variable attributes |
|
459 @rtype dict |
|
460 """ |
|
461 d = {} |
|
462 count = 0 |
|
463 for key in var.keys(): |
|
464 count += 1 |
|
465 value = var.getlist(key) |
|
466 key = "{0} (ID:{1})".format(self.keyToStr(key), id(key)) |
|
467 d[key] = value |
|
468 if count > MaxItemsToHandle: |
|
469 d[TooLargeAttribute] = TooLargeMessage |
|
470 break |
|
471 |
|
472 d["___len___"] = len(var) |
|
473 |
|
474 return d |
|
475 |
|
476 |
279 defaultResolver = DefaultResolver() |
477 defaultResolver = DefaultResolver() |
280 dictResolver = DictResolver() |
478 dictResolver = DictResolver() |
281 listResolver = ListResolver() |
479 listResolver = ListResolver() |
282 setResolver = SetResolver() |
480 setResolver = SetResolver() |
283 |
481 ndarrayResolver = NdArrayResolver() |
284 # TODO: add resolver for numpy arrays |
482 multiValueDictResolver = MultiValueDictResolver() |
285 # TODO: add resolver for Django MultiValueDict |
|
286 # TODO: add resolver for collections.deque |
|
287 |
483 |
288 ############################################################ |
484 ############################################################ |
289 ## Methods to determine the type of a variable and the |
485 ## Methods to determine the type of a variable and the |
290 ## resolver class to use |
486 ## resolver class to use |
291 ############################################################ |
487 ############################################################ |