Basic Math: Examples of decorators

A simple function:


In [30]:
def add(a, b):
    """add() adds things"""
    return a + b

In [31]:
add(3,4)


Out[31]:
7

But what if we'd like to log when it's called ?


In [32]:
def logged_add(a, b):
    print '### %s(%r, %r)' % ('add', a, b)
    result = add(a, b)
    print '### %s(%r, %r) --> %r' % ('add', a, b, result)
    return result

In [33]:
logged_add(3,4)


### add(3, 4)
### add(3, 4) --> 7
Out[33]:
7

You could change all calls to this... bleh

( Particularly if you have multple functions you want logged versions of. )

So make a "wrapper function" that will created a logged version of an arbitrary function:


In [34]:
def logged(func):
    def wrapper(a, b):
        print '### %s(%r, %r)' % (func.func_name, a, b)
        result = func(a, b)
        print '### %s(%r, %r) --> %r' % (func.func_name, a, b, result)
        return result
    return wrapper

And use it for add:


In [35]:
add = logged(add)

In [36]:
add(3,4)


### add(3, 4)
### add(3, 4) --> 7
Out[36]:
7

And make it more generic (arbitrary number of arguments)


In [37]:
def logged(func):
    def wrapper(*args):
        print '### %s(%s)' % (func.func_name, args)
        result = func(*args)
        print '### %s(%s) --> %r' % (func.func_name, args, result)
        return result
    return wrapper

In [38]:
def add(a, b):
    """add() adds things"""
    return a + b
add = logged(add)

In [39]:
add(3,4)


### add((3, 4))
### add((3, 4)) --> 7
Out[39]:
7

And a couple more:


In [40]:
def subtract(a, b):
    """subtract() subtracts two things"""
    return a - b
subtract = logged(subtract)

def even(a):
    """even() returns True if the value is even"""
    return a % 2 == 0
even = logged(even)

And use them...


In [41]:
add(1, 1)


### add((1, 1))
### add((1, 1)) --> 2
Out[41]:
2

In [42]:
add(2, 2)


### add((2, 2))
### add((2, 2)) --> 4
Out[42]:
4

In [43]:
subtract(2, 1)


### subtract((2, 1))
### subtract((2, 1)) --> 1
Out[43]:
1

In [44]:
even(42)


### even((42,))
### even((42,)) --> True
Out[44]:
True

In [45]:
even(43)


### even((43,))
### even((43,)) --> False
Out[45]:
False

In [ ]: