2014-09-19 57 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 
相關問題