What are some common uses for Python decorators? [closed]
I've used them for synchronization.
import functoolsdef synchronized(lock): """ Synchronization decorator """ def wrap(f): @functools.wraps(f) def newFunction(*args, **kw): lock.acquire() try: return f(*args, **kw) finally: lock.release() return newFunction return wrap
As pointed out in the comments, since Python 2.5 you can use a with
statement in conjunction with a threading.Lock
(or multiprocessing.Lock
since version 2.6) object to simplify the decorator's implementation to just:
import functoolsdef synchronized(lock): """ Synchronization decorator """ def wrap(f): @functools.wraps(f) def newFunction(*args, **kw): with lock: return f(*args, **kw) return newFunction return wrap
Regardless, you then use it like this:
import threadinglock = threading.Lock()@synchronized(lock)def do_something(): # etc@synchronzied(lock)def do_something_else(): # etc
Basically it just puts lock.acquire()
/ lock.release()
on either side of the function call.
I use decorators for type checking parameters which are passed to my Python methods via some RMI. So instead of repeating the same parameter counting, exception-raising mumbo-jumbo again and again.
For example, instead of:
def myMethod(ID, name): if not (myIsType(ID, 'uint') and myIsType(name, 'utf8string')): raise BlaBlaException() ...
I just declare:
@accepts(uint, utf8string)def myMethod(ID, name): ...
and accepts()
does all the work for me.