有些场景要求装饰器函数也有参数
示例:
#! -*- coding: utf-8 -*-
"""
在函数中嵌入装饰器
"""
from functools import wraps
def logit(logfile = 'out.log'):
# 永远记得从这个函数开始
def logging_decorator(func):
# 注意的是为什么这儿
@wraps(func)
def wrapped_function(*args, **kwargs):
log_string = func.__name__ + " was called"
print(log_string)
with open(logfile, 'a') as opened_file:
opened_file.write(log_string + '\n')
return func(*args, **kwargs)
return wrapped_function
return logging_decorator
# 注意不是@logit
# logit() 返回的是logging_decorator,语法糖含义更深了
# 特别关注的这里是logit()而不是之前普通的logit。
@logit()
def myfunc1():
pass
myfunc1()
@logit(logfile = 'func2.log')
def myfunc2():
pass
myfunc2()
小结
在业务开发中极少数场景需要装饰器函数也携带参数,理解装饰器的意义就可以轻松理解这种语法。
网友评论