Intercept method calls in Python

Python Programming

Question or problem about Python programming:

I’m implementing a RESTful web service in python and would like to add some QOS logging functionality by intercepting function calls and logging their execution time and so on.

Basically i thought of a class from which all other services can inherit, that automatically overrides the default method implementations and wraps them in a logger function. What’s the best way to achieve this?

How to solve the problem:

Solution 1:

Something like this? This implictly adds a decorator to your method (you can also make an explicit decorator based on this if you prefer that):

class Foo(object):
    def __getattribute__(self,name):
        attr = object.__getattribute__(self, name)
        if hasattr(attr, '__call__'):
            def newfunc(*args, **kwargs):
                print('before calling %s' %attr.__name__)
                result = attr(*args, **kwargs)
                print('done calling %s' %attr.__name__)
                return result
            return newfunc
        else:
            return attr

when you now try something like:

class Bar(Foo):
    def myFunc(self, data):
        print("myFunc: %s"% data)

bar = Bar()
bar.myFunc(5)

You’ll get:

before calling myFunc
myFunc:  5
done calling myFunc

Solution 2:

What if you write a decorator on each functions ? Here is an example on python’s wiki.

Do you use any web framework for doing your webservice ? Or are you doing everything by hand ?

Hope this helps!