Python 创建记录参数的函数装饰器
我正在使用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
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