2016-03-06 46 views
0

我正在编写python API,我有一个问题。 我有3个不同的功能:3个不同功能的一个装饰器

func1()  -> return only text 
func2(name) -> return text only but takes parameter 
func3(name) -> this function create a file "name".txt 

现在我有装饰的一个问题,我想创建一个被称为每次功能的日志装饰被调用。 问题是我不知道如何简单地做到这一点,我知道如何创建它没有参数或一个参数,但我不知道热的创建将适用于所有三个功能的通用装饰器。

现在我有这样的事情:

def log(func): 
    def wrapper(name): 
     func(name) 
     log = ('write something here') 
     f = open('log.txt', 'a+') 
     f.write(log + "\n") 
     f.close(name) 
    return wrapper 
+0

你需要使用任意参数 - 例如见http://stackoverflow.com/q/36901/3001761。然后只要'返回''func'返回的任何东西,不显式返回任何东西的函数返回'None'。 – jonrsharpe

回答

2

你的包装应该接受的参数任意数量,与*args**kwargs语法同时捕获位置和关键字参数。确保返回无论包装的函数返回:

def log(func): 
    def wrapper(*args, **kwargs): 
     result = func(*args, **kwargs) 
     log = ('write something here') 
     with open('log.txt', 'a+') as f: 
      f.write(log + "\n") 
     return result 
    return wrapper 

你可能想在@functools.wraps decorator增加;这份跨越任何文档和其他元数据从原来的包装功能,新包装:

from functools import wraps 

def log(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     result = func(*args, **kwargs) 
     log = ('write something here') 
     with open('log.txt', 'a+') as f: 
      f.write(log + "\n") 
     return result 
    return wrapper 

最后但并非最不重要的,而不是重新打开日志文件自己,看看在logging module处理日志文件为你。

+0

谢谢我会尝试,看起来像我需要的答案。 ;) – eMZet

1
def log(func): 
    def wrapper(*args, **kwds): 
     log = func(*args, **kwds) 
     f = open('log.txt', 'a+') 
     f.write(log + "\n") 
     f.close() 
    return wrapper 

@log 
def func1(): 
    return "Called function 1" 

@log 
def func2(name): 
    return "Called function 2 with " + name 

@log 
def func3(name): 
    f = open('name.txt', 'a+') 
    f.write(name + " from func3\n") 
    f.close() 
    return "Called function 3 with " + name 

def main(): 
    func1() 
    func2("func2") 
    func3("func3") 

if __name__ == '__main__': 
    main() 

log.txt的变成:

Called function 1 
Called function 2 with func2 
Called function 3 with func3