装饰器
从 Typescript 开发者的视角来看 python 的装饰器
Overview
下面是一个简单的装饰器示例,展示了如何使用 fastapi 的装饰器来添加路由
from fastapi import APIRouter
router = APIRouter()
@router.get("/")
def read_root():
return {"Hello": "World"}高阶函数
和 TS 中的装饰器一致,python 中的装饰器本质上也是高阶函数,即返回了函数的函数
def logit(func):
def wrapper(*args, **kwargs):
print("logit")
return func(*args, **kwargs)
return wrapper
@logit
def do_something():
print("do_something")
do_something()装饰器也允许接收参数,但是如果要接收参数,那么装饰器就需要返回一个函数,这个函数再接收被装饰的函数作为参数
def logit(params):
def decorated(func):
def wrapper(*args, **kwargs):
print(f"logit[{params}]")
return func(*args, **kwargs)
return wrapper
return decorated
@logit('info')
def do_something():
print("do_something")
do_something()但是这样写似乎太麻烦了,为了传参数而多定义了一层,所以 python 提供了一种类装饰器的写法
from functools import wraps
class logit:
def __init__(self, params):
self.params = params
def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"logit[{self.params}]")
return func(*args, **kwargs)
return wrapper
@logit('info')
def do_something():
print("do_something")
do_something()