Python之functools模块使用

functools模块中主要包含了一些函数装饰器和便捷的功能函数,关于装饰器的介绍可见这里

wraps

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 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
<function wrapper at 0x10c86b668>
wrapper
call test():
args = I'm a param
wrapper param: I'm a param

了解装饰器的应该都知道,test其实是指向wapper函数的指针,所以test.name输出是wapper, functools里面的wraps可以把原函数的元信息拷贝到装饰器里面的func函数中,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 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
<function test at 0x10d6c4668>
test
call test():
args = I'm a param
test param: I'm a param

可以看到,test.__name__已经发生了变化。@wraps接受一个函数来进行装饰,并加入了复制函数名称、注释文档、参数列表等等的功能。这可以让我们在装饰器里面访问在装饰之前的函数的属性

有用就打赏一下作者吧!