python装饰器 functools模块
  X5zJxoD00Cah 2023年11月02日 36 0

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)

https://zhuanlan.zhihu.com/p/45535784

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()
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  X5zJxoD00Cah   2023年12月11日   26   0   0 知乎Python迭代器
  X5zJxoD00Cah   2023年12月12日   34   0   0 Python.net
X5zJxoD00Cah