📦 归档笔记 — 原创建于 WizNote,仅作归档展示;观点以当年为准,非最新。

通俗理解@functools.wraps()

创建时间2021-02-21最后修改2021-02-21原位置/程序员成长之旅/Python学习/字数298
目录:程序员成长之旅/Python学习

功能

Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和函数属性

不加wraps

def my_decorator(func): def wrapper(*args, **kwargs): '''decorator''' print('Calling decorated function...') return func(*args, **kwargs) return wrapper @my_decorator def example(): """Docstring""" print('Called example function') print(example.name, example.doc)

13

1 def

my_decorator ( func ): 2

def

wrapper ( * args , ** kwargs ): 3

'''decorator''' 4

print ( 'Calling decorated function...' ) 5

return

func ( * args , ** kwargs ) 6

return

wrapper 7 8 @my_decorator 9 def

example (): 10

"""Docstring""" 11

print ( 'Called example function' ) 12 13 print ( example . name , example . doc )

运行结果

wrapper decorator

1 wrapper

decorator

加上wraps

import functools def my_decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): '''decorator''' print('Calling decorated function...') return func(*args, **kwargs) return wrapper @my_decorator def example(): """Docstring""" print('Called example function') print(example.name, example.doc)

17

1 import

functools 2 3 4 def

my_decorator ( func ): 5

@functools . wraps ( func ) 6

def

wrapper ( * args , ** kwargs ): 7

'''decorator''' 8

print ( 'Calling decorated function...' ) 9

return

func ( * args , ** kwargs ) 10

return

wrapper 11 12 @my_decorator 13 def

example (): 14

"""Docstring""" 15

print ( 'Called example function' ) 16 17 print ( example . name , example . doc )

运行结果 example Docstring

1 example

Docstring