python-18 装饰器
柯里化
装饰器
import datetime
import time
def logger(fn):
def wrapper(*args, **kwargs):
print('before +++++++++++++++++++')
start = datetime.datetime.now()
ret = fn(*args, **kwargs)
delta = (datetime.datetime.now() - start).total_seconds()
print('{} took {}s'.format(fn.__name__, delta))
return ret
return wrapper
@logger # logger 1 个参数 add = logger(add) => add = wrapper
def add(x, y):
time.sleep(2)
return x + y
print(add(10, 11))
文档字符串
def copy_properties(src, dest):
dest.__name__ = src.__name__
dest.__doc__ = src.__doc__
def logger(fn):
def wrapper(*args, **kwargs):
"""wrapper function doc"""
print('brfore ++++++++')
ret = fn(*args, **kwargs)
print('alter +++++++++')
return ret
# wrapper.__name__ = fn.__name__
# wrapper.__doc__ = fn.__doc__
copy_properties(fn, wrapper)
return wrapper
#@logger
def add(x, y):
"""add function doc"""
return x + y
print(add(10, 11))
print(add.__name__, add.__doc__)
def copy_properties(src):
def _copy(dest):
dest.__name__ = src.__name__
dest.__doc__ = src.__doc__
return dest
return _copy
def logger(fn):
@copy_properties(fn)
def wrapper(*args, **kwargs):
"""wrapper function doc"""
print('brfore ++++++++')
ret = fn(*args, **kwargs)
print('alter +++++++++')
return ret
# wrapper.__name__ = fn.__name__
# wrapper.__doc__ = fn.__doc__
#copy_properties(fn)(wrapper)
return wrapper
@logger
def add(x, y):
"""add function doc"""
return x + y
print(add(10, 11))
print(add.__name__, add.__doc__)
又做一层柯里化
from functools import update_wrapper, wraps
import time
def savedb(name, delta):
print('存入数据库')
pass
def logger(duration=5, x=lambda name, delta:print("{} took {}s. slowly".format(name, delta))):
def inner(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
start = datetime.datetime.now()
ret = fn(*args, **kwargs)
delta = (datetime.datetime.now() - start).total_seconds()
if delta > duration:
x(fn.__name__, delta)
return ret
return wrapper
return inner
@logger(x=savedb)
def add(x, y):
time.sleep(6)
return x + y
functools模块
类型注解
友好提示,不影响执行