python functools

# 做用:消除裝飾器反作用

# functools模塊
# update_wrapper(wapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
# 相似copy_properties功能
# wrapper包裝函數,wrapped被包裝函數
# 元組WRAPPER_ASSIGNMENTS中是要被覆蓋的屬性
# __model__(模塊名),__name__(名字),__qualname__(限定名),__doc__(文檔),__annotations(參數註解)__
# 元組WRAPPER_UPDATES中是要被更新的屬性,__dict__屬性字典
# 增長一個__wrapped__屬性,保存wrapped函數

import functools

def logger(fn):
def wrapper(*args, **kwargs):
print('before')
ret = fn(*args, **kwargs)
print('after')
return ret
print('{} {}'.format(id(wrapper), id(fn)))
return functools.update_wrapper(wrapper, fn) # update_wrapper返回值就是wrapper

@logger
def add(x, y):
'''
This is a fun
:param x: int
:param y: int
:return: int
'''
ret = x + y
return ret

print('1 -----------------------------------------')
print(add.__name__, add.__doc__, add.__qualname__, sep='\n')
print(id(add.__wrapped__)) # 被包裝函數的內存地址

# functools模塊
# wraps(wrapped, assigned = WRAPPER_ASSIGNMENTS, updated = WRAPPER_UPDATES) **消除裝飾器反作用
# 相似copy_properties功能
# wrapped被包裝函數
# 元組WRAPPER_ASSIGNMENTS中是要被覆蓋的屬性
# __model__(模塊名),__name__(名字),__qualname__(限定名),__doc__(文檔),__annotations(參數註解)__
# 元組WRAPPER_UPDATES中是要被更新的屬性,__dict__屬性字典
# 增長一個__wrapped__屬性,保存wrapped函數

import functools

def logger(fn):
@functools.wraps(fn) def wrapper(*args, **kwargs): print('before') ret = fn(*args, **kwargs) print('after') return ret print('{} {}'.format(id(wrapper), id(fn))) return wrapper@loggerdef add(x, y): ''' This is a fun :param x: int :param y: int :return: int ''' ret = x + y return retprint('2 -----------------------------------------')print(add.__name__, add.__doc__, add.__qualname__, sep='\n')print(id(add.__wrapped__)) # 被包裝函數的內存地址print(add(4, 40))
相關文章
相關標籤/搜索