How to determine which method was used in an inheritance heirarchy?
Erik Jones
erik at myemma.com
Mon Jul 16 12:25:49 EDT 2007
On Jul 16, 2007, at 10:35 AM, Chris Mellon wrote:
> 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()
Chris, that is absolutely perfect. Also, I don't think there is such
a thing as profiling code that isn't hacky ;)
Erik Jones
Software Developer | Emma®
erik at myemma.com
800.595.4401 or 615.292.5888
615.292.0777 (fax)
Emma helps organizations everywhere communicate & market in style.
Visit us online at http://www.myemma.com
More information about the Python-list
mailing list