Source code for qtt.utilities.debug

# %% Tools for debugging code

import os
import functools
import tempfile
import time
import datetime

# %% Debugging


[docs]def dumpstring(txt, tag='dump', showfile=False): """ Dump a text string to temperary file on disk """ _ = tempfile.mkdtemp() # init tdir = tempfile.tempdir if tdir is None: tdir = tempfile.mkdtemp() tfile = os.path.join(tdir, 'qtt-%s.txt' % tag) dumpstring.tfile = tfile # store temporary file in object with open(tfile, 'a+t') as fid: fid.write(txt + '\n')
# %% Decorator for generic function
[docs]def functioncalldecorator(f, name=None): """ Decorate a function to log input and output arguments """ if name is None: try: # try to get name from parent class c = f.__self__ name = c.name except: name = 'none' @functools.wraps(f) def wrapped(*args, **kwargs): dstr = str(datetime.datetime.now()) clock = time.perf_counter() r = f(*args, **kwargs) ss = 'function %s: %.6f, %s\n' % (name, clock, dstr) + 'function %s: arguments %s, %s' % (name, args, kwargs) dumpstring(ss + '\n' + 'function %s: output %s\n' % (name, r, ), tag='functionlog') #print ('method %s: output %s' % (f, r) ) return r return wrapped
# %%
[docs]def logInstrument(instrument): """ Decorate all parameters of an instrument with logging methods """ for k in instrument.parameters: p = instrument.parameters[k] if hasattr(p, 'get'): print('decorate %s' % p) p.get = functioncalldecorator(p.get, '%s.get' % p.name) if hasattr(p, 'get') and hasattr(p, 'set'): p.set = functioncalldecorator(p.set, '%s.set' % p.name)