我正在编写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
答案 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()