syntax

function部分只需要填写一个接受函数为参数并且返回一个函数的表达式就行

@function
def your_func():
	...

例子

给一个返回文本的函数的返回值两边加上任意html标签

def add_tag(tag_name):
	def wrapper(func):
		def tmp():
			return f"<{tag_name}>{func()}</{tag_name}>"
		return tmp
	return wrapper
>>> def add_tag(tag_name):
...     def wrapper(func):
...             def tmp():
...                     return f"<{tag_name}>{func()}</{tag_name}>"
...             return tmp
...     return wrapper
...
>>> @add_tag('a')
... def test():
...     return 'hello world'
...
>>> test()
'<a>hello world</a>'

__name__

在使用装饰器后函数的 __name__ 属性会变成装饰器内的函数名,如上面给出的例子中,打印被装饰过的函数的 __name__ 最后会得到 tmp

>>> print(test.__name__)
tmp

这个问题可以通过给 tmp 加上functools.wraps装饰器解决。

def add_tag(tag_name):
	def wrapper(func):
		@functools.wraps(func)
		def tmp():
			return f"<{tag_name}>{func()}</{tag_name}>"
		return tmp
	return wrapper
>>> def add_tag(tag_name):
...     def wrapper(func):
...             @functools.wraps(func)
...             def tmp():
...                     return f"<{tag_name}>{func()}</{tag_name}>"
...             return tmp
...     return wrapper
...
>>> @add_tag('a')
... def test():
...     return 'a'
...
>>> test.__name__
'test'