首先是“智能功能”的概念:
>>> def f(x,check={}):
if x not in check:
print 'call f'
check[x]=2*x
return check[x]
>>> f(2)
call f
4
>>> f(2)
4
>>> f(3)
call f
6
>>>
这意味着,如果你给出相同的参数,它只计算一次。当没有第一次调用时,它直接返回值。
我对这种功能评价很高。因为有了它,你不必定义一个变量来存储值,还可以节省计算源。
但是这个函数太简单了,当我想定义另一个智能函数g时,我必须重复一些类似的东西:
>>> def g(x,check={}):
if x not in check:
print 'call g'
check[x]=x**2
return check[x]
所以,我的问题出现了,如何定义一个装饰器“懒惰”,它的工作方式如下:
@lazy
def func(a,b,*nkw,**kw):
print 'call func'
print a,b
for k in nkw:
print k
for (k,v) in kw.items():
print k,v
#do something with a,b,*kw,**nkw to get the result
result=a+b+sum(nkw)+sum(kw.values())
return result
print '--------1st call--------'
print func(1,2,3,4,5,x=6,y=7)
print '--------2nd call--------'
print func(1,2,3,4,5,x=6,y=7)
结果:
>>>
--------1st call--------
call func
1 2
3
4
5
y 7
x 6
28
--------2nd call--------
28
注意,当没有 *kw 或 **nkw 时,ie:func(1,2) 也需要智能工作。提前谢谢!