您的位置:首页 > 其它

9-2为被装饰的函数保存元数据

2017-03-24 09:52 288 查看
# -*- coding:utf-8 -*-

'''f.__name__
f.__doc__
f.__module__    所属模块
f.__defaults__  默认参数
f.__closure__   闭包'''

import functools

def f(a, b = 1, c = []):
'''func for print abc'''
print a, b, c
return

def f_():
a = 2
b = 10
c = 100
return lambda k: a ** k + b

def mydecorator(func):
@functools.wraps(func)           # 新添加的一行
def wrapper(*args, **kargs):
'''wrapper function'''
print 'IN wrapper'
func(*args, **kargs)
return wrapper

@mydecorator
def example():
'''example function'''
print 'IN example'
# 如果现在调用 print example.__name__    print example.__doc__将会返回wrapper的信息
# 使用标准库 functools 中的装饰器 wraps 装饰内部包裹函数

if __name__ == '__main__':
print f.__name__
print f.__doc__
print f.__module__
print f.__defaults__
print f.__closure__

f.__defaults__[1].append('abc')
f(100)
print f.__defaults__ #所以在默认参数里面不要使用可变对象

p = f
print p.__name__

print '*' * 30
print f_.__closure__
g = f_()
print g.__closure__
c = g.__closure__[2]
# 现在运行程序会产生‘IndexError: tuple index out of range’错误
# 只有匿名函数中使用到的 a, b 在闭包里
print c.cell_contents

print '*' * 30
print g(10)         # 原来 ** 运算符是次数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: