Created
April 15, 2015 20:26
-
-
Save se4u/2035dc4137b77f4a2d69 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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