一个装饰3个不同的功能

时间:2016-03-06 13:58:06

标签: python function decorator python-decorators

我正在编写python API,我有一个问题。 我有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

2 个答案:

答案 0 :(得分: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来处理日志文件。

答案 1 :(得分:1)

for (size_t i = 0; i < populationSize; ++i) {
    auto *individual = new Individual(templateObject);
    population.push_back(individual);
}

Log.txt变为:

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