Creating logged functions using decorators

Paul McGuire ptmcg at austin.rr.com
Sat Jul 7 20:59:43 CEST 2007


On Jul 7, 1:47 pm, "Nathan Harmston" <ratchetg... at googlemail.com>
wrote:
> Hi,
>
> I m thinking about writing some code which logs the input and output
> of a function/script and stores it in a database using sqlalchemy
> (although I havent started on this yet). I want to do this via a
> decorator ( I think this is the best way ).
>
> def log(fn):
>     def newfn(*args):
>         print datetime.date.today()
>         print __file__
>         print fn.__name__
>         print args
>         return fn(*args)
>     return newfn
>
> @log
> def doAnalysis(a, b):
>     print a, b
>     return a + b
>
> doAnalysis(3, 7)
>
> I can access the arguments passed to the "logged" function, but is
> there anyway I can capture the output of the function i.e. 10.
>
> Many Thanks in advance,
>
> Nathan

Yes.  Capture the output of the function to a variable and log it
before you return it.

def log(fn):
    def newfn(*args):
        print datetime.date.today()
        print __file__
        print fn.__name__
        print args
        returnValue = fn(*args)
        print returnValue
        return
    return newfn

Here's another idea: wrap the call to fn inside a try/except block, so
that if the function raises an exception, you can log it and then
reraise it.

-- Paul




More information about the Python-list mailing list