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. Erik Jones Software Developer | Emma® [EMAIL PROTECTED] 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 -- http://mail.python.org/mailman/listinfo/python-list