人生苦短,我用python。

一、functools模块

functools使用频率较高的2个函数:partial()偏函数 和 wraps()消除装饰器使函数名和函数doc发生变化的副作用。

1、partial() 偏函数

1
2
3
4
5
6
7
8
9
import functools
dir(functools) # 查看functools包含哪些工具函数

def showarg(*args, **kw):
print(args)
print(kw)
p = functools.partial(showarg,1,2,a='A') # 偏函数,把一个函数的某些参数设置默认值,返回一个新的函数
p() # 偏函数生成的新函数,打印结果:(1, 2) {'a': 'A'}
p(3,4,b='B') # 调用新函数,打印结果:(1, 2, 3, 4) {'a': 'A', 'b': 'B'}

2、wraps() 消除装饰器使函数名和函数doc发生变化的副作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import functools
dir(functools) # 查看functools包含哪些工具函数

# 1、使用wraps前
def note(func):
"note function"
def wrapper():
"wrapper function"
print('note something')
return func()
return wrapper

@note # 使用装饰器后,被装饰函数其实已经是另外一个函数了(函数名和函数的doc会发生改变)
def test():
"test function"
print('I am test')
test()
print(test.__doc__)

# 打印结果:
# note something # 先打印装饰函数的结果
# I am test # 再打印被装饰函数的结果
# wrapper function # doc属性变成装饰函数的doc


# 2、使用wraps后
def note(func):
"note function"
@functools.wraps(func) # 在装饰函数前使用wraps,可以消除装饰器使函数名和函数doc发生变化的副作用
def wrapper():
"wrapper function"
print('note something')
return func()
return wrapper

@note
def test():
"test function"
print('I am test')
test()
print(test.__doc__)

# 打印结果:
# note something # 先打印装饰函数的结果
# I am test # 再打印被装饰函数的结果
# test function # doc属性还是被装饰函数的doc

持续更新…

最后更新: 2018年12月04日 16:58

原始链接: http://pythonfood.github.io/2017/12/30/pythonFunctools模块/

× 多少都行~
打赏二维码