#!/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 != '': # top level usually name.append( codename ) # function or a method del parentframe return ".".join(name)