wynemo
6/12/2013 - 3:35 PM

slide.md

decorators

####closure in python

def generate_power_func(n):
    def nth_power(x):
        return x**n
    return nth_power

get a new function

raised_to_4 = generate_power_func(4)

now delete generate_power_func

>>> del generate_power_func
>>> raised_to_4(2)
16

dig deeper

>>> raised_to_4.__closure__[0].cell_contents
4

http://www.shutupandship.com/2012/01/python-closures-explained.html

####wrapper

example

import functools
def logging(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print func.__name__
        return func(*args, **kwargs)
    return wrapper

now use decorator

@logging
def foo():
    pass

or

foo = logging(foo)

if use functools.wraps:

>>> print foo.__name__
foo

else

>>> print foo.__name__
wrapper

import flask import functools

app = flask.Flask(name)

def handler_logger(f): @functools.wraps(f) def g(*args, *kwargs): print 'before request' r = f(args, **kwargs) print 'after request' return r return g

@app.route('/') @handler_logger def root(): return 'Hello World'

@app.route('/wtf') @handler_logger def wtf(): return 'I bought a watch last year'

def main(): app.run(port=7777)

if name == 'main': main()

def suppress_errors(log_func): def decorator(func): @functools.wraps(func) def wrapper(*args, *kwargs): try: return func(args, **kwargs) except Exception as e: log_func(str(e)) return wrapper return decorator

foo = suppress_errors(log_func)(foo)