2014-09-19 24 views
-2

我用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

现在告诉我们你到目前为止的代码。 – 2014-09-19 14:53:29

+0

既然你是要求一个指针,我发现[这篇文章](http://www.artima.com/weblogs/viewpost.jsp?thread=240808)非常有用。 – 2014-09-19 14:54:02

+0

叹了口气,今天早上有人没有想清楚。 – chepner 2014-09-19 15:06:23

回答

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))

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 
相关问题