Notes for Quarter 2, class 4

Questions that came up

More on Decorators

Eric found this decorator in Core Python Programming by Wesley Chun.

#! /usr/bin/env python

from time import time

def logged(when):
    def log(f, *args, **kargs):
        print('''Called
            function: %s
            args: %r
            kargs: %r''' % (f, args, kargs))

    def pre_logged(f):
        def wrapper(*args, **kargs):
            log(f, *args, **kargs)
            return f(*args, **kargs)
        return wrapper

    def post_logged(f):
        def wrapper(*args, **kargs):
            now = time()
            try:
                return f(*args, **kargs)
            finally:
                log(f, *args, **kargs)
                print("time delta: %s" % (time() - now))
        return wrapper

    try:
        return {"pre": pre_logged,
                "post": post_logged}[when]
    except KeyError as e:
        raise (ValueError(e), 'must be "pre" or "post" ')


@logged("post")
def hello(name):
    print("Hello, ", name)

hello("World")

There’s a lot of layers of nesting in there – let’s figure it out!

Context Managers

Any questions?

Let’s take a look at my solutions.