创建一个记录参数的函数装饰器

时间:2014-09-19 14:52:14

标签: python

我正在使用Python编写一个函数装饰器,它记录参数并在调用时返回函数的值

    def logfunc(prefix)

输出应该是sys.stderr格式:

"{prefix}: {function name}({positional args}..., {keyword=args}, ...)" 

"{prefix}: {function name} -> {return value}"

分别用于呼叫和返回。

这是如何使用的:

@logfunc("test")
def f(arg)
    return arg

我不安静明白吗?有人能告诉我指针吗?

2 个答案:

答案 0 :(得分:1)

我发现这个问题很有意思,即使问得很严重: - (

简单的部分,如果在Python文档中有没有参数的装饰器的例子,但我花了一些时间来理解装饰参数的装饰器实际上是一个接受参数并返回装饰器的函数。一旦明确这一点,答案几乎是明显的:

def logger(prefix):
    def decorate(f):
        def wrapper(*args, **kwargs):
            print(prefix, f.__name__, "args", args, "kwargs", kwargs)
            cr = f(*args, **kwargs)
            print(prefix, f.__name__, "result", cr)
            return cr
        return wrapper
    return decorate

用法:

>>> @logger("test")
def zut(a, b, foo='FOO'):
    return a+b

>>> zut(2,3)
test zut args (2, 3) kwargs {}
test zut cr 5
5
>>> zut(2,3, foo = 'FEE')
test zut args (2, 3) kwargs {'foo': 'FEE'}
test zut cr 5
5

答案 1 :(得分:0)

import logging

logger = logging.getLogger(__name__)

def logging_decorator(fn):
    def func(*a, **kw):
       logger.info('%s(%s, %s)', fn, a, kw)
       return fn(*a, **kw)
    return func

如果您要打印到stderr,可以使用import sys,然后使用sys.stderr.write('%s(%s, %s)' % (fn, a, kw))