How to determine which method was used in an inheritance heirarchy?

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Mon Jul 16 10:37:40 CEST 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