@functionname
或@functionname(参数列表)
方式,简化调用__doc__
访问这个文档def add(x, y):"""This is a function of addition."""return x + yprint("name = {}ndoc = {}".format(add.__name__, add.__doc__, add.__defaults__))
print('=' * 55)
print(help(add))
name = add
doc = This is a function of addition.=======================================================
Help on function add in module __main__:add(x, y)This is a function of addition.None
装饰器 代码
import datetime, functoolsdef logger(fn):print('=== logger start ===')print('{} fn_id is {}'.format(fn.__name__, id(fn)))@functools.wraps(fn)def wrapper(*args, **kwargs):print('=== wrapper start ===')print('{} fn_id is {}'.format(fn.__name__, id(fn)))start = w()ret = fn(*args, **kwargs)delta = (w() - start).total_seconds()if delta > 3:print('Too slow.')print('=== wrapper end ===')return retprint('=== logger end ===')return wrapper
其它函数代码,注意在 被装饰函数 没有被调用的时候,即在被装饰 函数定义的时候,装饰器已经执行过了,注意print
语句
# add1(args) => logger(add1)(args) => functools.wraps(add1)(wrapper)(args)
@logger
def add1(x, y):time.sleep(2)return x + yprint('=' * 25)@logger # add2 => logger(add2)
def add2(x, y, z):time.sleep(4)return x + y + zprint('=' * 25)print(add1.__name__, add2.__name__)
# 上述代码执行结果
=== logger start ===
add1 fn_id is 121600328
=== logger end ===
=========================
=== logger start ===
add2 fn_id is 121601048
=== logger end ===
=========================
add1 add2
执行 被装饰函数
print('add1 >>>', add1(1, 2))
print('add2 >>>', add2(1, 2, 3))
# 上述代码执行结果
=== wrapper start ===
add1 fn_id is 121600328
=== wrapper end ===
add1 3
=== wrapper start ===
add2 fn_id is 121601048
Too slow.
=== wrapper end ===
add2 6
logger
什么时候执行
定义 被装饰函数 的时候执行
logger
执行过几次
装饰几个函数,执行几次
wraps
装饰器什么时候执行
执行 被装饰函数 的时候
wraps
装饰器执行过几次
每执行一个 被装饰函数,执行一次
wrapper
的 __name__
等属性被覆盖过几次
没有覆盖,每次调用都不是同一个函数对象
import datetime
import timedef logger(fn):def wrapper(*args, **kwargs):"""I am wrapper."""start = w()ret = fn(*args, **kwargs)duration = w() - startprint('function {} took {}s.'.format(fn.__name__, al_seconds()))return retreturn wrapper@logger # 相当于 add = logger(add)
def add(x,y):"""I am add."""time.sleep(2)return x + yprint(add(5, y = 8))
print(add.__name__, add.__doc__)
function add took 2.0s.
13
wrapper I am wrapper.
import datetime
import timedef copy_properties(src, dst):dst.__name__ = src.__name__dst.__doc__ = src.__doc__def logger(fn):def wrapper(*args, **kwargs):"""I am wrapper."""start = w()ret = fn(*args, **kwargs)duration = w() - startprint('function {} took {}s.'.format(fn.__name__, al_seconds()))copy_properties(fn, wrapper)return retreturn wrapper@logger # 相当于 add = logger(add)
def add(x,y):"""I am add."""time.sleep(2)return x + yprint(add(5, y = 8))
print(add.__name__, '|||', add.__doc__)
function add took 2.0s.
13
add ||| I am add.
import datetime
import time# 柯里化
def copy_properties(src):def _copy_properties(dst):dst.__name__ = src.__name__dst.__doc__ = src.__doc__return dstreturn _copy_propertiesdef logger(fn):def wrapper(*args, **kwargs):"""I am wrapper."""start = w()ret = fn(*args, **kwargs)duration = w() - startprint('function {} took {}s.'.format(fn.__name__, al_seconds()))# copy_properties(fn)(wrapper) => _copy_properties(wrapper)copy_properties(fn)(wrapper)return retreturn wrapper@logger # 相当于 add = logger(add)
def add(x,y):"""I am add."""time.sleep(2)return x + yprint(add(5, y = 8))
print(add.__name__, '|||', add.__doc__)
function add took 2.0s.
13
add ||| I am add.
import datetime
import timedef copy_properties(src):def _copy_properties(dst):dst.__name__ = src.__name__dst.__doc__ = src.__doc__return dstreturn _copy_propertiesdef logger(fn):@copy_properties(fn) # 带参装饰器# wrapper => copy_properties(fn)(wrapper) => _copy_properties(wrapper)def wrapper(*args, **kwargs):"""I am wrapper."""start = w()ret = fn(*args, **kwargs)duration = w() - startprint('function {} took {}s.'.format(fn.__name__, al_seconds()))# copy_properties(fn)( wrapper)return retreturn wrapper@logger
# 相当于 add = logger(add) => add = wrapper
# 无参装饰器,本质上等效为 单参数 的函数
def add(x,y): # lambda x, y:x + y"""I am add."""print('===== call add =====')time.sleep(2)return x + yprint(add(5, y = 8))
print(add.__name__, '|||', add.__doc__)
===== call add =====
function add took 2.0s.
13
add ||| I am add.
from functools import update_wrapper, wraps
import datetime
import timedef logger(fn):@wraps(fn)def wrapper(*args, **kwargs):"""I am wrapper."""start = w()ret = fn(*args, **kwargs)duration = w() - startprint('function {} took {}s.'.format(fn.__name__, al_seconds()))return retreturn wrapper@logger
def add(x,y):"""I am add."""time.sleep(2)return x + yprint(add(5, y = 8))
print(add.__name__, '|||', add.__doc__)
function add took 2.0s.
13
add ||| I am add.
from functools import update_wrapper, wraps
import datetime
import timedef logger(duration=5):def _logger(fn):@wraps(fn) def wrapper(*args, **kwargs):"""I am wrapper."""start = w()ret = fn(*args, **kwargs)delta = (w() - start).total_seconds()if delta > duration:print('function {} took {:.2f}s.'.format(fn.__name__, delta))else:print('function {} run so fast.'.format(fn.__name__))return retreturn wrapperreturn _logger@logger(3)
def add(x,y):"""I am add."""time.sleep(2)return x + yprint(add(5, y = 8))
print(add.__name__, '|||', add.__doc__)
function add run so fast.
13
add ||| I am add.
from functools import update_wrapper, wraps
import datetime
import timedef x(delta, func, duration):if delta > duration:print('function {} took {:.2f}s. It run too slow.'.format(func.__name__, delta))def logger(duration=2, func=x):def _logger(fn):@wraps(fn) # wrapper = update_wrapper(fn)(wrapper)def wrapper(*args, **kwargs):start = w()ret = fn(*args, **kwargs)delta = (w() - start).total_seconds()func(delta, fn, duration)return retreturn wrapperreturn _logger@logger()
def add(x,y): time.sleep(3)return x + yprint(add(5, y = 8))
print(add.__name__, '|||', add.__doc__)
function add took 3.00s. It run too slow.
13
add ||| None
本文发布于:2024-01-30 04:48:58,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170656134219332.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |