How to determine which method was used in an inheritance heirarchy?
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Mon Jul 16 04:37:40 EDT 2007
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.
--
Gabriel Genellina
More information about the Python-list
mailing list