Skip to content

Instantly share code, notes, and snippets.

@karlcow
Last active August 29, 2015 14:06
Show Gist options
  • Select an option

  • Save karlcow/525a26f74787ecfcd84a to your computer and use it in GitHub Desktop.

Select an option

Save karlcow/525a26f74787ecfcd84a to your computer and use it in GitHub Desktop.

I wanted to get a way to inspect the value of variables when a function was called without modifying the code. I tested it on a simple function, and it does what I wanted.

--------------------------------------------------------------------------------
date: '2014-07-11T23:59:00+07:00'
doc: <Element {http://www.w3.org/1999/xhtml}html at 0x10c180638>
DATETYPE: 'created'
finddate: string(//__xpp1:time[@class='created']/@datetime)
Returned: '2014-07-11T23:59:00+07:00'
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
date: '2014-09-08T18:21:00+09:00'
doc: <Element {http://www.w3.org/1999/xhtml}html at 0x10c180638>
DATETYPE: 'modified'
finddate: string(//__xpp1:time[@class='modified']/@datetime)
Returned: '2014-09-08T18:21:00+09:00'
--------------------------------------------------------------------------------
import sys
import threading
def show_guts(f):
sentinel = object()
gutsdata = threading.local()
gutsdata.captured_locals = None
gutsdata.tracing = False
def trace_locals(frame, event, arg):
if event.startswith('c_'): # C code traces, no new hook
return
if event == 'call': # start tracing only the first call
if gutsdata.tracing:
return None
gutsdata.tracing = True
return trace_locals
if event == 'line': # continue tracing
return trace_locals
# event is either exception or return, capture locals, end tracing
gutsdata.captured_locals = frame.f_locals.copy()
return None
def wrapper(*args, **kw):
# preserve existing tracer, start our trace
old_trace = sys.gettrace()
sys.settrace(trace_locals)
retval = sentinel
try:
retval = f(*args, **kw)
finally:
# reinstate existing tracer, report, clean up
sys.settrace(old_trace)
print '-' * 80
for key, val in gutsdata.captured_locals.items():
print '{}: {!r}'.format(key, val)
if retval is not sentinel:
print 'Returned: {!r}'.format(retval)
print '-' * 80
gutsdata.captured_locals = None
gutsdata.tracing = False
return retval
return wrapper
@show_guts
def getdocdate(doc, DATETYPE):
'''return the creation date of the document in ISO format YYYY-MM-DD
Input the document, typeofdate in between created and modified
'''
if DATETYPE not in DATETYPELIST:
sys.exit("ERROR: No valid type for the date: " + DATETYPE)
finddate = etree.ETXPath(
"string(//{%s}time[@class=%r]/@datetime)" % (HTMLNS, DATETYPE))
date = finddate(doc)
return date
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment