python带参数装饰器的两种写法
前言
最近在实现一个装饰器的过程中发现了一个很有意思的地方,在博客里面分享出来
不同的写法
三层函数嵌套,实现了可传参数的一个装饰器。
import logging
import functools
def logger(msg=None):
"""日志"""
def dector(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
logging.info(func.__name__ + func.__doc__)
logging.info(f"参数:{args}{kwargs}")
if msg:
log.info(msg.format(result))
return result
return wrapper
return dector
使用functools.partial
函数实现了一个比较抽象的三层带参数装饰器。
import logging
import functools
def loggers(func=None, msg=None):
"""日志"""
if func is None:
return functools.partial(loggers, msg=msg)
@functools.wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
logging.info(func.__name__ + func.__doc__)
logging.info(f"参数:{args}{kwargs}")
if msg:
log.info(msg.format(result))
return result
return wrapper
有何异同
可以看到从代码的阅读层面来讲,第一个写法是比较易读的,第二种写法不容易阅读。从执行调用方面第二种更简单点。
先看以下第一种调用执行的方式:
- 第一种写法
装饰器传参数
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
@loggers(msg='hello {}')
def demo(name):
"""演示函数"""
print("你好%s" % name)
return "wxhou"
if _name__== '__main__':
demo( 'wxhou ' )
装饰器不传参数
@loggers()
def demo(name):
"""演示函数"""
print('你好%s'% name)
return "wxhou"
if ___name__== '__main_':
demo( 'wxhou ')
- 第二种写法
装饰器不带参数
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
@logger
def demo(name):
"""演示函数"""
print("你好%s"% name)
return "wxhou"
if __name_ == '__main__':
demo( 'wxhou ')
装饰器带参数
@logger(msg=' hello {}')
def demo(name):
"""演示函数"""
print("你好%s" % name)
return "wxhou"
if _name__ == '__main__':
demo( 'wxhou ')
可以看到使用了functools.partial
函数的装饰器,在调用非必填参数时,可以不用使用括号。
除了写法理解比较抽象,这样的调用还是比较友好的。
本文来自博客园,作者:I'm_江河湖海,转载请注明原文链接:https://www.cnblogs.com/jhhh/p/16760942.html