partial
就是把某个函数的某个参数固定,从而创建出一个新的函数;
- 示例:
| 12
 3
 4
 5
 6
 
 | from functools import partialdef add(x:int, y:int):
 return x+y
 
 add2 = partial(add, y=2)
 add2(3)
 
 | 
- 源码
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | def partial(func, *args, **keywords):def newfunc(*fargs, **fkeywords):
 newkeywords = keywords.copy()
 newkeywords.update(fkeywords)
 return func(*args, *fargs, **newkeywords)
 newfunc.func = func
 newfunc.args = args
 newfunc.keywords = keywords
 return newfunc
 
 | 
 update_wrapper
从 被修饰的函数(wrapped) 中取出一些属性值来,赋值给 修饰器函数(wrapper)
- 源码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__','__annotations__')WRAPPER_UPDATES = ('__dict__',)
 def update_wrapper(wrapper,
 wrapped,
 assigned = WRAPPER_ASSIGNMENTS,
 updated = WRAPPER_UPDATES):
 for attr in assigned:
 try:
 value = getattr(wrapped, attr)
 except AttributeError:
 pass
 else:
 setattr(wrapper, attr, value)
 for attr in updated:
 getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
 wrapper.__wrapped__ = wrapped
 return wrapper
 
 | 
- 自定义装饰器1
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | def wrapper(f):def wrapper_function(*args, **kwargs):
 """这个是修饰函数"""
 return f(*args, **kwargs)
 return wrapper_function
 
 @wrapper
 def wrapped():
 """这个是被修饰的函数"""
 print('wrapped')
 print(wrapped.__doc__)
 print(wrapped.__name__)
 
 | 
- 自定义装饰器2
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | from functools import update_wrapperdef wrapper(f):
 def wrapper_function(*args, **kwargs):
 """这个是修饰函数"""
 return f(*args, **kwargs)
 update_wrapper(wrapper_function, f)
 return wrapper_function
 
 @wrapper
 def wrapped():
 """这个是被修饰的函数"""
 print('wrapped')
 print(wrapped.__doc__)
 print(wrapped.__name__)
 
 | 
 wraps
一个修饰器版的update_wrapper函数,它的功能和update_wrapper是一模一样的;
- 源码
| 12
 3
 4
 5
 6
 7
 
 | WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__','__annotations__')WRAPPER_UPDATES = ('__dict__',)
 def wraps(wrapped,
 assigned = WRAPPER_ASSIGNMENTS,
 updated = WRAPPER_UPDATES):
 return partial(update_wrapper, wrapped=wrapped,
 assigned=assigned, updated=updated)
 
 | 
- 自定义装饰器3
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | from functools import wrapsdef wrapper(f):
 @wraps(f)
 def wrapper_function(*args, **kwargs):
 """这个是修饰函数"""
 return f(*args, **kwargs)
 return wrapper_function
 
 @wrapper
 def wrapped():
 """这个是被修饰的函数
 """
 print('wrapped')
 print(wrapped.__doc__)
 print(wrapped.__name__)
 
 |