装饰器 是返回值为另一个函数的函数。
装饰器语法只是一种语法糖,以下两个函数定义在语义上完全等价:
def f(arg):
...
f = staticmethod(f)
@staticmethod
def f(arg):
...
可调用对象与包装行为
更准确地说,函数装饰器在函数定义时接收被装饰的对象,并把返回结果绑定到原名称;装饰器不必是普通函数,返回值也不必始终是函数。前面的 staticmethod 示例正说明了包装结果可能是描述符对象。
多个装饰器按嵌套方式应用。包装函数若用于日志、鉴权或缓存,还应保留需要的参数及异常语义,并注意元数据;对异步函数,普通同步包装不会自动正确等待协程。调用外部系统产生的副作用也不能只靠“有装饰器”保证事务和权限正确。