def caller_name(self, skip=<NUM_LIT:2>):
stack = inspect.stack()<EOL>start = <NUM_LIT:0> + skip<EOL>if len(stack) < start + <NUM_LIT:1>:<EOL><INDENT>return '<STR_LIT>'<EOL><DEDENT>parentframe = stack[start][<NUM_LIT:0>]<EOL>name = []<EOL>module = inspect.getmodule(parentframe)<EOL>if module:<EOL><INDENT>name.append(module.__name__)<EOL><DEDENT>if '<STR_LIT>' in parentframe.f_locals:<EOL><INDENT>name.append(parentframe.f_locals['<STR_LIT>'].__class__.__name__)<EOL><DEDENT>codename = parentframe.f_code.co_name<EOL>if codename != '<STR_LIT>':  <EOL><INDENT>name.append(codename)  <EOL><DEDENT>del parentframe<EOL>return "<STR_LIT:.>".join(name)<EOL>
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