How to determine which method was used in an inheritance heirarchy?

Chris Mellon arkanes at gmail.com
Mon Jul 16 11:35:57 EDT 2007


On 7/16/07, Erik Jones <erik at myemma.com> wrote:
> On Jul 16, 2007, at 3:37 AM, Gabriel Genellina wrote:
>
> > En Mon, 16 Jul 2007 03:56:18 -0300, Erik Jones <erik at myemma.com>
> > escribió:
> >
> >> Perhaps an even better example of what I'm trying to do would be in
> >> order (this is minus any exception handling):
> >>
> >> import sys
> >>
> >> def mytrace(frame, event, arg):
> >>      if event == 'call':
> >>          func_name = frame.f_code.co_name
> >>
> >>          if func_name in frame.f_locals['self'].__class__.__dict__:
> >>              print frame.f_locals['self'].__class__.__name__
> >>          else:
> >>              for base in frame.f_locals['self'].__class__.__bases__:
> >>                  if func_name in base.__dict__:
> >>                      print base.__name__
> >>                      break
> >>
> >>
> >> class A(object):
> >>      def __init__(self):
> >>          pass
> >>
> >> class B(A):
> >>      def __init__(self):
> >>          A.__init__(self)
> >>
> >> sys.settrace(mytrace)
> >> B()
> >>
> >> This will output:
> >>
> >> B
> >> B
> >
> > If you don't mind post-processing the results, you can log the
> > function
> > name and source module (from frame.f_code.co_name and co_filename) and
> > current line number (frame.f_lineno). Later, obtaining the class
> > name from
> > those is a bit tricky (and not even the inspect module does it
> > right), but
> > perhaps using the tokenizer module, watching for lines that contain
> > "class" <name> is enough.
>
>
> I was afraid of that.  I used pretty much that tokenizer trick for a
> unit test generator I wrote in php a while back and felt like that
> was pretty clunky then.
>


Hacky, but maybe this will work:

import sys
import inspect

def mytrace(frame, event, arg):
    if event == 'call':
        func_name = frame.f_code.co_name
        klassOb = frame.f_locals['self'].__class__
        for klass in inspect.getmro(klassOb):
            cf = klass.__dict__.get(func_name)
            if hasattr(cf, "func_code") and cf.func_code == frame.f_code:
                print klass.__name__


class A(object):
    def __init__(self):
        pass

class B(A):
    def __init__(self):
        A.__init__(self)

sys.settrace(mytrace)
B()



More information about the Python-list mailing list