Annotated đặt Depends vào phần kiểu, không phải phần giá trị mặc định.
FastAPI khuyến nghị cách này từ bản 0.95.0, và Ruff có rule FAST002 để bắt cách viết cũ.
python
CurrentUser = Annotated[User, Depends(get_current_user)]
@app.get("/me")
async def me(user: CurrentUser):
return user
# old style
@app.get("/me-old")
async def me_old(user: User = Depends(get_current_user)):
return userBa lợi ích thực tế:
- Kiểu được giữ nguyên → editor và mypy vẫn hiểu user là User, thay vì suy ra kiểu của Depends.
- Không vướng thứ tự tham số: cách cũ biến tham số thành "có giá trị mặc định", nên tham số bắt buộc phía sau sẽ báo lỗi cú pháp.
- Tái sử dụng: gán ra một alias (CurrentUser) rồi dùng lại ở hàng chục route, đổi dependency chỉ sửa một chỗ.
Hàm dependency vẫn có thể gọi trực tiếp trong test vì chữ ký của nó không bị Depends làm bẩn.