Aller au contenu

Types de données supplémentaires

🌐 Traduction par IA et humains

Cette traduction a été réalisée par une IA guidée par des humains. 🤝

Elle peut contenir des erreurs d'interprétation du sens original, ou paraître peu naturelle, etc. 🤖

Vous pouvez améliorer cette traduction en nous aidant à mieux guider le LLM d'IA.

Version anglaise

Jusqu'à présent, vous avez utilisé des types de données courants, comme :

  • int
  • float
  • str
  • bool

Mais vous pouvez aussi utiliser des types de données plus complexes.

Et vous bénéficierez toujours des mêmes fonctionnalités que jusqu'à présent :

  • Excellente prise en charge dans l'éditeur.
  • Conversion des données à partir des requêtes entrantes.
  • Conversion des données pour les données de réponse.
  • Validation des données.
  • Annotations et documentation automatiques.

Autres types de données

Voici quelques types de données supplémentaires que vous pouvez utiliser :

  • UUID :
    • Un « identifiant universel unique » standard, couramment utilisé comme ID dans de nombreuses bases de données et systèmes.
    • Dans les requêtes et les réponses, il sera représenté sous forme de str.
  • datetime.datetime :
    • Un datetime.datetime Python.
    • Dans les requêtes et les réponses, il sera représenté sous forme de str au format ISO 8601, par exemple : 2008-09-15T15:53:00+05:00.
  • datetime.date :
    • datetime.date Python.
    • Dans les requêtes et les réponses, il sera représenté sous forme de str au format ISO 8601, par exemple : 2008-09-15.
  • datetime.time :
    • Un datetime.time Python.
    • Dans les requêtes et les réponses, il sera représenté sous forme de str au format ISO 8601, par exemple : 14:23:55.003.
  • datetime.timedelta :
    • Un datetime.timedelta Python.
    • Dans les requêtes et les réponses, il sera représenté sous forme de float de secondes totales.
    • Pydantic permet aussi de le représenter sous la forme d'un « encodage de différence de temps ISO 8601 », voir la documentation pour plus d'informations.
  • frozenset :
    • Dans les requêtes et les réponses, traité de la même manière qu'un set :
      • Dans les requêtes, une liste sera lue, les doublons éliminés, puis convertie en set.
      • Dans les réponses, le set sera converti en list.
      • Le schéma généré indiquera que les valeurs du set sont uniques (en utilisant uniqueItems de JSON Schema).
  • bytes :
    • bytes Python standard.
    • Dans les requêtes et les réponses, traité comme une str.
    • Le schéma généré indiquera qu'il s'agit d'une str avec le « format » binary.
  • Decimal :
    • Decimal Python standard.
    • Dans les requêtes et les réponses, géré de la même manière qu'un float.
  • Vous pouvez consulter tous les types de données Pydantic valides ici : Types de données Pydantic.

Exemple

Voici un exemple de chemin d'accès avec des paramètres utilisant certains des types ci-dessus.

from datetime import datetime, time, timedelta
from typing import Annotated
from uuid import UUID

from fastapi import Body, FastAPI

app = FastAPI()


@app.put("/items/{item_id}")
async def read_items(
    item_id: UUID,
    start_datetime: Annotated[datetime, Body()],
    end_datetime: Annotated[datetime, Body()],
    process_after: Annotated[timedelta, Body()],
    repeat_at: Annotated[time | None, Body()] = None,
):
    start_process = start_datetime + process_after
    duration = end_datetime - start_process
    return {
        "item_id": item_id,
        "start_datetime": start_datetime,
        "end_datetime": end_datetime,
        "process_after": process_after,
        "repeat_at": repeat_at,
        "start_process": start_process,
        "duration": duration,
    }
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from datetime import datetime, time, timedelta
from uuid import UUID

from fastapi import Body, FastAPI

app = FastAPI()


@app.put("/items/{item_id}")
async def read_items(
    item_id: UUID,
    start_datetime: datetime = Body(),
    end_datetime: datetime = Body(),
    process_after: timedelta = Body(),
    repeat_at: time | None = Body(default=None),
):
    start_process = start_datetime + process_after
    duration = end_datetime - start_process
    return {
        "item_id": item_id,
        "start_datetime": start_datetime,
        "end_datetime": end_datetime,
        "process_after": process_after,
        "repeat_at": repeat_at,
        "start_process": start_process,
        "duration": duration,
    }

Notez que les paramètres à l'intérieur de la fonction ont leur type de données naturel et que vous pouvez, par exemple, effectuer des manipulations de dates normales, comme :

from datetime import datetime, time, timedelta
from typing import Annotated
from uuid import UUID

from fastapi import Body, FastAPI

app = FastAPI()


@app.put("/items/{item_id}")
async def read_items(
    item_id: UUID,
    start_datetime: Annotated[datetime, Body()],
    end_datetime: Annotated[datetime, Body()],
    process_after: Annotated[timedelta, Body()],
    repeat_at: Annotated[time | None, Body()] = None,
):
    start_process = start_datetime + process_after
    duration = end_datetime - start_process
    return {
        "item_id": item_id,
        "start_datetime": start_datetime,
        "end_datetime": end_datetime,
        "process_after": process_after,
        "repeat_at": repeat_at,
        "start_process": start_process,
        "duration": duration,
    }
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from datetime import datetime, time, timedelta
from uuid import UUID

from fastapi import Body, FastAPI

app = FastAPI()


@app.put("/items/{item_id}")
async def read_items(
    item_id: UUID,
    start_datetime: datetime = Body(),
    end_datetime: datetime = Body(),
    process_after: timedelta = Body(),
    repeat_at: time | None = Body(default=None),
):
    start_process = start_datetime + process_after
    duration = end_datetime - start_process
    return {
        "item_id": item_id,
        "start_datetime": start_datetime,
        "end_datetime": end_datetime,
        "process_after": process_after,
        "repeat_at": repeat_at,
        "start_process": start_process,
        "duration": duration,
    }