diff options
| author | Andrew Lamoureux <andrew@vector35.com> | 2019-03-23 01:15:14 -0400 |
|---|---|---|
| committer | Andrew Lamoureux <andrew@vector35.com> | 2019-03-23 01:15:14 -0400 |
| commit | 334c0e966eeb67cc88975cc51c3b7e17f7d1b1ee (patch) | |
| tree | fbee805aa70f1b85f4513f488df5e0683458da98 /python/examples/kaitai/kshelpers.py | |
| parent | af001b025b5aad5b205cb97977f3951fe6ef2a71 (diff) | |
kaitai: python3-compatible forgiveness for struct properties
hasattr() on python2 has built in exception handler that would
return False when computation of a property screwed up - that
doesnt exist in python3
Diffstat (limited to 'python/examples/kaitai/kshelpers.py')
| -rw-r--r-- | python/examples/kaitai/kshelpers.py | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/python/examples/kaitai/kshelpers.py b/python/examples/kaitai/kshelpers.py index bcdc9931..1deeef59 100644 --- a/python/examples/kaitai/kshelpers.py +++ b/python/examples/kaitai/kshelpers.py @@ -84,7 +84,6 @@ def ksImportClass(moduleName): classThing = getattr(module, className) except Exception as e: log.log_error('importing kaitai module %s' % moduleName) - #log.log_debug(e) pass return classThing @@ -97,11 +96,13 @@ def parseFpath(fpath, ksModuleName=None): ksClass = ksImportClass(ksModuleName) if not ksClass: return None + parsed = None try: parsed = ksClass.from_file(fpath) parsed._read() - except Exception: - log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) + except Exception as e: + log.log_error('parseFpath(): kaitai module %s threw exception, check file type' % ksModuleName) + parsed = None return parsed @@ -113,11 +114,13 @@ def parseData(data, ksModuleName=None): ksClass = ksImportClass(ksModuleName) if not ksClass: return None + parsed = None try: parsed = ksClass.from_bytes(data) parsed._read() - except Exception: - log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) + except Exception as e: + log.log_error('parseData(): kaitai module %s threw exception, check file type' % ksModuleName) + parsed = None return parsed @@ -134,12 +137,13 @@ def parseIo(ioObj, ksModuleName=None): ksClass = ksImportClass(ksModuleName) if not ksClass: return None + parsed = None try: ioObj.seek(0, io.SEEK_SET) parsed = ksClass.from_io(ioObj) parsed._read() - except Exception: - log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) + except Exception as e: + log.log_error('parseIo(): kaitai module %s threw exception, check file type' % ksModuleName) parsed = None return parsed @@ -300,19 +304,20 @@ def buildQtree(ksobj): qwi = KaitaiTreeWidgetItem() qwi.setKaitaiObject(ksobj) - for fieldName in dir(ksobj): - if hasattr(ksobj, fieldName): - getattr(ksobj, fieldName) - - fields = dir(ksobj) - for fieldName in fields: - if fieldName.startswith('_') and (not fieldName.startswith('_m_')): - continue - if fieldName in exceptions: + fieldNames = [] + for candidate in dir(ksobj): + if candidate.startswith('_') and (not candidate.startswith('_m_')): continue - if not hasattr(ksobj, fieldName): + if candidate in exceptions: continue - if ('_m_'+fieldName) in fields: + try: + if getattr(ksobj, candidate, False): + fieldNames.append(candidate) + except Exception: + pass + + for fieldName in fieldNames: + if ('_m_'+fieldName) in fieldNames: # favor the '_m_' version which seems to get the debug info continue |
