On 7/16/07, Erik Jones <[EMAIL PROTECTED]> wrote: > On Jul 16, 2007, at 3:37 AM, Gabriel Genellina wrote: > > > En Mon, 16 Jul 2007 03:56:18 -0300, Erik Jones <[EMAIL PROTECTED]> > > 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() -- http://mail.python.org/mailman/listinfo/python-list