Search code examples
pythonstackruntimesequence-diagram

How to get the caller class name inside a function of another class in python?


My objective is to stimulate a sequence diagram of an application for this I need the information about a caller and callee class names at runtime. I can successfully retrieve the caller function but not able to get a caller class name?

#Scenario caller.py:

import inspect

class A:

    def Apple(self):
        print "Hello"
        b=B()
        b.Bad()



class B:

    def Bad(self):
        print"dude"
        print inspect.stack()


a=A()
a.Apple()

When I printed the stack there was no information about the caller class. So is it possible to retrieve the caller class during runtime ?


Solution

  • Well, after some digging at the prompt, here's what I get:

    stack = inspect.stack()
    the_class = stack[1][0].f_locals["self"].__class__.__name__
    the_method = stack[1][0].f_code.co_name
    
    print("I was called by {}.{}()".format(the_class, the_method))
    # => I was called by A.a()
    

    When invoked:

    ➤ python test.py
    A.a()
    B.b()
      I was called by A.a()
    

    given the file test.py:

    import inspect
    
    class A:
      def a(self):
        print("A.a()")
        B().b()
    
    class B:
      def b(self):
        print("B.b()")
        stack = inspect.stack()
        the_class = stack[1][0].f_locals["self"].__class__.__name__
        the_method = stack[1][0].f_code.co_name
        print("  I was called by {}.{}()".format(the_class, the_method))
    
    A().a()
    

    Not sure how it will behave when called from something other than an object.