FastAPI/Pydantic в проекте с MyPy
В настоящее время я работаю над руководством по fastAPI, и моя среда настроена на использование black, flake8, bandit и mypy. Все в этом уроке работает нормально, но мне постоянно приходится # печатать: игнорировать вещи, чтобы заставить mypy сотрудничать.
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
async def create_items(item: Item) -> Item:
return item
Mypy тогда ошибки:
❯ mypy main.py [14:34:08]
main.py:9: error: Incompatible types in assignment (expression has type "None", variable has type "str")
main.py:11: error: Incompatible types in assignment (expression has type "None", variable has type "float")
Я могу # type: ignore, но тогда я теряю подсказки типов и проверку в моем редакторе. Я что-то упускаю из виду или мне просто отключить mypy для проектов FastAPI?
1 ответ
Ты можешь использовать Optional
:
from typing import Optional
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
Что говорит mypy
что значение должно быть такого типа, но None
приемлемо
Если вы используете mypy, он может жаловаться на объявления типа, например:
tax: float = None
С ошибкой, например: Несовместимые типы в назначении (выражение имеет тип "None", переменная имеет тип "float"). В этих случаях вы можете использовать Optional, чтобы сообщить mypy, что значение может быть None, например:
tax: Optional[float] = None
В приведенном выше коде посмотрите это видео, оно было объяснено в этой базовой модели, объясненной здесь