Python语法装饰器@log

>>> 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()




你可能感兴趣的:(python,疑问)