Skip to content

Instantly share code, notes, and snippets.

@se4u
Created April 15, 2015 20:26
Show Gist options
  • Save se4u/2035dc4137b77f4a2d69 to your computer and use it in GitHub Desktop.
Save se4u/2035dc4137b77f4a2d69 to your computer and use it in GitHub Desktop.
# Filename: decomouse.py
# Description: Test all ways of creating python decorators.
# Author: Pushpendre Rastogi
# Created: Wed Apr 15 00:26:57 2015 (-0400)
# Last-Updated:
# By:
# Update #: 14
'''
A post by [Bruce Eckel at Artima]()
described all the ways of defining decorators.
I wrote this code to memorize those patterns.
After writing those files I believe that the post could
have been greatly simplified if Bruce just said that the
call mechanism changes when we have a decorator with arguments
from decorator(f) to decorator(args)(f).
USAGE: python decomouse.py
OUTPUT:
import saf
saf
run_saf (1, 2) {'a': 1, 'b': 1}
decosaf (1, 2) {'a': 1, 'b': 1}
None
import waf (10, 20) {'c': 10, 'd': 20}
import waf2
waf
run_waf (1, 2) {'a': 1, 'b': 1}
decowaf (1, 2) {'a': 1, 'b': 1}
None
import sac
sac
run_sac (1, 2) {'a': 1, 'b': 1}
decosac (1, 2) {'a': 1, 'b': 1}
None
import wac (10, 20) {'c': 10, 'd': 20}
import_wac again
wac
run_wac (1, 2) {'a': 1, 'b': 1}
decowac (1, 2) {'a': 1, 'b': 1}
None
'''
# Type 1: Decorators sans arguments (defined as function)
def saf(f):
print "import saf"
def wf(*args, **kwargs):
print "run_saf", args, kwargs
return f(*args, **kwargs)
return wf
@saf
def decosaf(*args, **kwargs):
print "decosaf", args, kwargs
return
print "saf\n", decosaf(1, 2, a=1, b=1), "\n"
# Type 2 : Decorators with arguments (defined as function)
# A decorator with argument is executed as `deco(arg)(f)` that's all.
def waf(*dargs, **dkwargs):
print "import waf", dargs, dkwargs
def internal_wf(f):
print "import waf2"
def wf(*args, **kwargs):
print "run_waf", args, kwargs
return f(*args, **kwargs)
return wf
return internal_wf
@waf(10, 20, c=10, d=20)
def decowaf(*args, **kwargs):
print "decowaf", args, kwargs
return
print "waf\n", decowaf(1, 2, a=1, b=1), "\n"
# Type 3: Decorators sans arguments (defined as class)
class sac(object):
def __init__(self, f):
print "import sac"
self.f = f
return
def __call__(self, *args, **kwargs):
print "run_sac", args, kwargs
return self.f(*args, **kwargs)
@sac
def decosac(*args, **kwargs):
print "decosac", args, kwargs
return
print "sac\n", decosac(1, 2, a=1, b=1), "\n"
# Type 4: Decorators with arguments (defined as class)
class wac(object):
def __init__(self, *dargs, **dkwargs):
print "import wac", dargs, dkwargs
return
def __call__(self, f):
print "import_wac again"
def wf(*args, **kwargs):
print "run_wac", args, kwargs
return f(*args, **kwargs)
return wf
@wac(10, 20, c=10, d=20)
def decowac(*args, **kwargs):
print "decowac", args, kwargs
return
print "wac\n", decowac(1, 2, a=1, b=1), "\n"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment