1 functools.partial 要求函数有两个以上的参数 并固定函数的部分参数
import functools
def add(a, b):
print(a / b)
# functools.partial 要求函数有两个以上的参数
add = functools.partial(add, 1) # 将函数的第一个参数固定为1 注意: 此时add已经是一个可调用对象. 而非函数
add(2) # 只需要输第二个参数
2 @wraps(func)
import functools
# 1) 将outer 定义代码块读入内存中, 没有调用outer()
def outer(func):
@functools.wraps(func)
def inner(*args, **kwargs):
print(f"before...")
func(*args, **kwargs)
print("after...")
return inner
# 2) 立即执行作为装饰器的函数outer( 被装饰的函数名add ) 其执行步骤见3
@outer
def add(a, b):
print(a / b)
# 4) 再调用add() 将执行inner(): 先print(f"before..."), 再调用add(1,2), 再print("after...")
add(1,2)
# 3) 2的执行步骤详解
# @functools.wraps(func) # 其解释见5
# 将inner 定义代码块读入内存中, 没有调用inner()
# 返回函数名inner
# 函数名inner 将被赋值给函数名add, 即add= inner
# 5) 对照6 可以发现不同
# 多了@functools.wraps(func)
# 少了 将调用func() 的返回值赋值给result 并在inner定义代码块的最后返回result (*)
# 但效果(包括顺序都)是一样的 先print, 再调用add(1,2) 再print
# 所以在inner定义代码块之前 先@functools.wraps(func) 再调用add(1,2) 效果等同于6 (*)
# 6) https://blog.51cto.com/u_16055028/6449686
def outer(func):
def inner():
print("认证成功!")
result = func()
print("日志添加成功")
return result
return inner
@outer
def f1():
print("业务部门1数据接口......")
f1()