log caller

attn.steven.kuo at gmail.com attn.steven.kuo at gmail.com
Wed Jun 27 19:52:57 EDT 2007


On Jun 27, 2:42 pm, Matthew Peter <survivedsu... at yahoo.com> wrote:
> Is it possible to print the function calls to a module? Like:
>
> test.py
> import mymod
> print mymod.x()
>
> mymod.py
> # each time a function is called we print out the called function and module
> print 'Func call: %s from %s' % (???, ???)
>
> def x():
>      return 'hello'
>
> Where would I pick up the ??? variables? A brief example would be nice too :) Thanks
> in advance!



You can use a decorator to wrap the function.  You can use
sys._getframe or
inspect.stack to get information about the caller.  The examples from
the decorator module are very useful:

    http://www.phyast.pitt.edu/~micheles/python/documentation.html

If for some reason you can't edit mymod.py to add the decorators, you
can still wrap the function:

import mymod
import inspect

try:
    from functools import update_wrapper
except ImportError:
    def decorator_trace(f):
        def newf():
            caller = inspect.stack()[1]
            print 'Caller is line %d of %s' % (caller[2], caller[1])
            print 'Calling: %s from %s' % (f.__name__, f.__module__)
            return f()
        newf.__name__ = f.__name__
        newf.__dict__.update(f.__dict__)
        newf.__doc__ = f.__doc__
        newf.__module__ = f.__module__
        return newf
else:
    def decorator_trace(f):
        def newf():
            caller = inspect.stack()[1]
            print 'Caller is line %d of %s' % (caller[2], caller[1])
            print 'Calling: %s from %s' % (f.__name__, f.__module__)
            return f()
        return update_wrapper(newf, f)


mymod.x = decorator_trace(mymod.x)
greetings = mymod.x()
print greetings


but this approach has the shortcoming mentioned in the article.

--
Hope this helps,
Steven




More information about the Python-list mailing list