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

В приведенном выше коде посмотрите это видео, оно было объяснено в этой базовой модели, объясненной здесь

Другие вопросы по тегам