diff options
Diffstat (limited to 'netmodel/util/debug.py')
-rw-r--r-- | netmodel/util/debug.py | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/netmodel/util/debug.py b/netmodel/util/debug.py new file mode 100644 index 00000000..dfa7d127 --- /dev/null +++ b/netmodel/util/debug.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# FROM: https://gist.github.com/techtonik/2151727 +# Public Domain, i.e. feel free to copy/paste +# Considered a hack in Python 2 +# + +import inspect +import traceback + +def print_call_stack(): + for line in traceback.format_stack(): + print(line.strip()) + +def caller_name(skip=2): + """Get a name of a caller in the format module.class.method + + `skip` specifies how many levels of stack to skip while getting caller + name. skip=1 means "who calls me", skip=2 "who calls my caller" etc. + + An empty string is returned if skipped levels exceed stack height + """ + stack = inspect.stack() + start = 0 + skip + if len(stack) < start + 1: + return '' + parentframe = stack[start][0] + + name = [] + module = inspect.getmodule(parentframe) + # `modname` can be None when frame is executed directly in console + if module: + name.append(module.__name__) + # detect classname + if 'self' in parentframe.f_locals: + # there seems to be no way to detect static method call - it will + # be just a function call + name.append(parentframe.f_locals['self'].__class__.__name__) + codename = parentframe.f_code.co_name + if codename != '<module>': # top level usually + name.append( codename ) # function or a method + del parentframe + return ".".join(name) + |