Python函数修饰符@的作用是为现有的函数增加额外的功能;其作用非常强大,今天我们就来谈谈它是如何在日志记录中起到很好的作用的。
先看一个例子:
import datetime
__DEBUG__ = True
def log(func):
if __DEBUG__:
print('函数开始于',datetime.datetime.now())
func()
if __DEBUG__:
print('函数结束于',datetime.datetime.now())
def test():
print('test')
test_lst = []
for i in range(100):
test_lst.append(i)
log(test)
log() 是一个日志函数,用于记录函数运行的开始时间,和结束时间。
可是这段代码有个弊端,在测试某个函数时,我们需要添加类似于log(test)这样的代码,不需要后把它删除;这样做很麻烦。
还好我们有@函数装饰符。修改前文中的代码,移除 log(text).
在test函数的上方加入@log装饰器。
@log
def test():
pass
这段代码和前文中的代码功能是一样的。
可是问题又来了;运行上述代码,发现我们没有调用 test 函数,test就已经被执行了,因为 @log 等于 log(test),有什么方法让它只有在我们调用的时候运行呢?修改代码:
import datetime
__DEBUG__ = True
def log(func):
def wrapper():
if __DEBUG__:
print('函数开始于',datetime.datetime.now())
func()
if __DEBUG__