aboutsummaryrefslogtreecommitdiffstats
path: root/netmodel/util/debug.py
diff options
context:
space:
mode:
Diffstat (limited to 'netmodel/util/debug.py')
-rw-r--r--netmodel/util/debug.py45
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)
+