| |||||||||||
| |||||||||||
Python decorators - wrapping a method call in extra code
Would you like to add an extra set of wrappers around a series of function of method calls - perhaps to add a profiler or logger to your application? These are examples of the things you can do with Python's decorators, introduced (with the syntax I'll show you below) in Python 2.4.
Here's a class of object that I've defined called "User". The only difference from regular code is the @logger line that's been added before each definition to ask for it to be wrapped in (decorated) with something called logger. class User:And here's the code of a test application that uses that class: team = []The results when I run (with the correct version of Python, of course!) are very much as you would expect: Dorothy:~/ grahamellis$ /usr/local/bin/python dec01 (Python 2.5)However ... there's an extra log file that was generated by the code in the decorator - ***__init__ <function __init__ at 0x650f0>The final piece of the jigsaw is the decorator itself - loaded in the top of the test source file in my example (full source code listing here but more often in its own separate module. def logger(f, name=None): # if logger.fhwr isn't defined and open ... try: if logger.fhwr: pass except: # ... open it logger.fhwr = open("log.txt","w") if name is None: name = f.func_name def wrapped(*args, **kwargs): logger.fhwr.write("***"+name+" "+str(f)+"\n"\ +str(args)+str(kwargs)+"\n\n") result = f(*args, **kwargs) return result wrapped.__doc__ = f.__doc__ return wrapped That's not a piece of "first day Python", with exceptions to check on the existance of a variable, names containing code blocks, and references to a number of interbal variables - but it will provide you with an excellent springboard from which you can start using decorators. Have you even said to yourself "I wish I could put all my function calls through this extra filter ....? Well - now you can - it's a Python decorator! (written 2007-04-15 07:54:44) Associated topics are indexed under Y212 - Further advanced features of Python
Some other Articles
Course, right place, right timeGordon Dodge, R.I.P. Helsinki - what comes naturally Turning objects into something you can store - Pickling (Python) Python decorators - wrapping a method call in extra code A picture (mostly in words) of Helsinki __new__ v __init__ - python constructor alternatives? Using a list of keys and a list of values to make a dictionary in Python - zip Python dictionary for quick look ups A course in Helsinki 1637 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 at 50 posts per pageThis is a page archived from The Horse's Mouth at http://www.wellho.net/horse/ - the diary and writings of Graham Ellis. Every attempt was made to provide current information at the time the page was written, but things do move forward in our business - new software releases, price changes, new techniques. Please check back via our main site for current courses, prices, versions, etc - any mention of a price in "The Horse's Mouth" cannot be taken as an offer to supply at that price. Link to Ezine home page (for reading). Link to Blogging home page (to add comments). |
| ||||||||||
PH: 01144 1225 708225 • FAX: 01144 1225 707126 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho | |||||||||||