>>> import functools
>>> def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s()' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
>>> @log('execute')
def now():
print('2017-10-19')
>>> now()
execute now()
2017-10-19
>>> now.__name__
'now'
>>> def log(text):
def decorator(func):
#@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s()' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
>>> @log('execute')
def now():
print('2017-10-19')
>>> now()
execute now()
2017-10-19
>>> now.__name__
'wrapper'
>>> now = log('execute')(now)
>>> now()
execute wrapper() #
execute now() #func.__name__ is still 'now'; func parameter in the outside decorator function is tied to the original now() as in * during execution
2017-10-19
*:
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
this is wrong:
def count():
fs = []
for i in range(1, 4):
def f():
return i*i #这个i 是for循环里面的i,会随着for循环执行变化
fs.append(f)
return fs
f1, f2, f3 = count()