Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Intercept method calls in Python

Tags:

python

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?

like image 330
Era Avatar asked Apr 24 '10 12:04

Era


2 Answers

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 
like image 174
KillianDS Avatar answered Sep 22 '22 19:09

KillianDS


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 ?

like image 24
dzen Avatar answered Sep 23 '22 19:09

dzen