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