Python 创建记录参数的函数装饰器

Python 创建记录参数的函数装饰器,python,Python,我正在使用Python编写一个函数装饰器,它记录参数并在调用函数时返回函数值 def logfunc(prefix) 输出到sys.stderr的格式应为: "{prefix}: {function name}({positional args}..., {keyword=args}, ...)" 及 分别用于呼叫和返回 这就是它的使用方式: @logfunc("test") def f(arg) return arg 我不明白?有人能给我拿个指针吗 import log

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

    def logfunc(prefix)
输出到sys.stderr的格式应为:

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

分别用于呼叫和返回

这就是它的使用方式:

@logfunc("test")
def f(arg)
    return arg
我不明白?有人能给我拿个指针吗

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))
我发现这个问题很有趣,即使问得不好:-(

简单的一点是,如果Python文档中有没有参数的decorator示例,但我花了一些时间才理解,接受参数的decorator实际上是一个接受参数并返回decorator的函数。一旦这一点清楚了,答案几乎是显而易见的:

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

现在向我们展示您到目前为止的代码。由于您需要一个指针,我发现非常有用。唉,今天早上有人没有想清楚。如果函数返回一个元组,可能会发生重复的情况?这是否安全,不会出现“太少/太多值无法解包”的情况?
>>> @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