def memo
cache = {}
@wraps(func)
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper
- 我們定義如下函數(shù),將輸入?yún)?shù)乘2并返回
def f(x):
'''
double input
'''
return x * 2
>>> f(3), f('a')
>>> 9, 'aa'
- 如果我們要求輸入?yún)?shù)x必須為
int
型,否則返回None
,可以通過定義函數(shù)fn_int
來實現(xiàn)
def fn_int(func):
def wrapper(*args):
for arg in args:
if not isintance(arg, int):
return
return func(*args)
return wrapper
>>> g = fn_int(f)
>>> f(3), f('a')
6, 'aa'
>>> g(3), g('a')
6, None
- 可以通過添加裝飾器符號
@
來將上面兩步驟合并
@fn_int
def f(x):
'''
double input
'''
return x * 2
>>> f(3), f('a')
6, None
但這時會有如下的問題
>>> f.__name__, f.__doc__
wrapper, None
而我們預期的結(jié)果是
f
double input
- 上面的問題可以由
functools.wraps
來解決
from functools import wraps
def fn_int(func):
@wraps(func) ### important line
def wrapper(*args):
for arg in args:
if not isintance(arg, int):
return
return func(*args)
return wrapper
@fn_int
def f(x):
'''
double input
'''
return x * 2
>>> f(3), f('a')
6, None
>>> f.__name__, f.__doc__
f
double input