Skip to content

Instantly share code, notes, and snippets.

@EastonLee
Last active September 20, 2023 13:32
Show Gist options
  • Save EastonLee/8942225eeee6c1dbd42e to your computer and use it in GitHub Desktop.
Save EastonLee/8942225eeee6c1dbd42e to your computer and use it in GitHub Desktop.
utility that can print context source code on any frame of stack and variables you care against Python inspect
collective_code_location_message = '\n'
def print_dict(dict, verbose=True):
#callerframerecord = inspect.stack()[1] # 0 represents this line
# # 1 represents line at caller
#frame = callerframerecord[0]
#info = inspect.getframeinfo(frame)
#if info.function == 'print_sql_result':
# code_probe('',2)
#else:
# code_probe('', 1)
message = 'print_dict:\n'
for row in dict:
message += '{}: {}\n'.format(uniform_to_utf8(row),
uniform_to_utf8(dict[row]))
if verbose:
print message
return message
def print_list(list, verbose=True):
#callerframerecord = inspect.stack()[1] # 0 represents this line
# # 1 represents line at caller
#frame = callerframerecord[0]
#info = inspect.getframeinfo(frame)
#if info.function == 'print_sql_result':
# code_probe('',2)
#else:
# code_probe('', 1)
message = 'print_list:\n'
for i in list:
i = uniform_to_utf8(i)
message += '{} '.format(i)
if verbose:
print message
return message
def print_sql_result(result):
print 'print_sql_result'
for row in result:
if isinstance(row, tuple):
print_list(row)
elif isinstance(row, dict):
print_dict(row)
def uniform_to_utf8(string):
if isinstance(string, unicode):
return string.encode('utf-8')
else:
return string
def uniform_to_unicode(string):
if isinstance(string, str):
return string.decode('utf-8')
else:
return string
def code_probe(arg='', relative_stack=0, offset=[-1,-1],
if_show_variables=True,
show_local=False, show_global=False, spec_variable=[]):
from inspect import currentframe, getframeinfo
import inspect, linecache
callerframerecord = inspect.stack()[1+relative_stack] # 0 represents this line
# 1 represents line at caller
frame = callerframerecord[0]
info = inspect.getframeinfo(frame)
""":type: Traceback"""
'''this method can get the current line'''
#lines_str = info.code_context[0]
lines = [linecache.getline(info.filename, info.lineno+i) for i in range(offset[0], offset[1]+1)]
lines_str = ''
for i,j in enumerate(lines):
if i == -offset[0]:
j = j[:-1] + ' <=========\n'
lines_str += j
message = '#[{}:{}{}]: {}====================={}' \
'\n{}\n'.format(info.filename, info.lineno, offset, info.function, arg, lines_str)
if if_show_variables:
locals_str = 'local variables:===================\n'+\
print_dict(frame.f_locals, verbose=False)+'\n' if show_local else ''
globals_str = 'global variables:===================\n'+\
print_dict(frame.f_globals, verbose=False)+'\n' if show_global else ''
spec_v_str = ''
if spec_variable == []:
last_line = linecache.getline(info.filename, info.lineno-1)
import re
spec_variable = [ re.search(r'\b(\w*)[^\w]', last_line).group(1) ]
for i in spec_variable:
spec_v_str += '"{}"'.format(i)
if i in frame.f_locals:
spec_v_str += ' locals : {}\n'.format(frame.f_locals[i])
if i in frame.f_globals:
spec_v_str += ' globals : {}\n'.format(frame.f_globals[i])
if i not in frame.f_locals and i not in frame.f_globals:
spec_v_str += ' not found\n'
message += '{}' \
'{}' \
'spec_variables:===================\n' \
'{}'.format(locals_str,
globals_str,
spec_v_str)
message += '#[end]=====================\n'
print message
global collective_code_location_message
import datetime
collective_code_location_message += '{}<<<<<<<<<<<<<<\n{}'\
.format(datetime.datetime.now(), message)
return message
if __name__ == "__main__":
blah = 'blah'
'blan'
foo = 1 + 2
code_probe('foo', offset=[-3,4], if_show_variables=True, show_global=False, spec_variable=['blah'])
bar = 'bar'
code_probe(if_show_variables=True)
print 'new line'
print 'another new line'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment