Created
December 21, 2011 23:09
-
-
Save slor/1508130 to your computer and use it in GitHub Desktop.
An example and explaination of a Python decorator that takes a non-optional parameter.
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
""" An example of writing a decorator that takes an argument. | |
Based on e-satis's answer at http://stackoverflow.com/questions/739654/understanding-python-decorators#1594484. | |
""" | |
from functools import wraps | |
# The outer-most level is the decorator factory. The middle level is the | |
# decorator and the inner most level is where we call the decorated function. | |
def decorator_maker(buzz): | |
""" Returns a decorator. | |
If buzz is True, then will make decorated functions say 'BUZZ!'. | |
""" | |
def dec(func): | |
""" Decorates a function. """ | |
# Use wraps() to preserve information about the wrapped function. | |
@wraps(func) | |
def wrapper(*args, **kwargs): | |
""" Calls the decorated (wrapped) function. """ | |
if buzz: | |
print "BUZZ!" | |
return func(*args, **kwargs) | |
return wrapper | |
return dec | |
if __name__ == '__main__': | |
# These below are progressivly more compact ways to achieve the decoration | |
# effect w/o using @decorator syntax. For illustration only. | |
def func(x, y=None): | |
print x, y | |
decorator = decorator_maker(True) | |
decorated_func = decorator(func) | |
decorated_func(1, y=2) | |
decorated_func = decorator_maker(True)(func) | |
decorated_func(1, y=2) | |
decorator_maker(True)(func)(1, y=2) | |
# This below is how to call the decorator w/ optional args. | |
@decorator_maker(True) | |
def func2(x, y=None): | |
print x, y | |
func2(1, y=2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment