Python之functools模块使用
functools模块中主要包含了一些函数装饰器和便捷的功能函数,关于装饰器的介绍可见这里。
# wraps
# encoding:utf8
# python装饰器
def log(func):
def wrapper(*args, **kwargs):
print('call %s():' % func.__name__)
print('args = {}'.format(*args))
return func(*args, **kwargs)
return wrapper
@log
def test(p):
print(test.__name__ + " param: " + p)
print(test)
print(test.__name__)
test("I'm a param")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
输出结果:
<function wrapper at 0x10c86b668>
wrapper
call test():
args = I'm a param
wrapper param: I'm a param
1
2
3
4
5
2
3
4
5
了解装饰器的应该都知道,test其实是指向wapper函数的指针,所以test.__name__输出是wapper, functools里面的wraps可以把原函数的元信息拷贝到装饰器里面的func函数中,示例如下:
# encoding:utf8
# python装饰器
import functools
def log(func):
# 能把原函数的元信息拷贝到装饰器里面的func函数中,函数的元信息包括docstring、name、参数列表等等
@functools.wraps(func)
def wrapper(*args, **kwargs):
print('call %s():' % func.__name__)
print('args = {}'.format(*args))
return func(*args, **kwargs)
return wrapper
@log
def test(p):
print(test.__name__ + " param: " + p)
test("I'm a param")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
输出结果:
<function test at 0x10d6c4668>
test
call test():
args = I'm a param
test param: I'm a param
1
2
3
4
5
2
3
4
5
可以看到,test.__name__
已经发生了变化。@wraps接受一个函数来进行装饰,并加入了复制函数名称、注释文档、参数列表等等的功能。这可以让我们在装饰器里面访问在装饰之前的函数的属性
上次更新: 2022/12/01, 11:09:34