12. Extra Data Types
1. Extra Data Types
- 지금까지 다음과 같은 일반적인 데이터 타입을 사용했다.
1] int
2] float
3] str
4] bool
- 하지만 이것 말고도 더 복잡한 데이터 타입을 사용할 수도 있다.
2. Other data types
- 다음과 같은 추가 데이터 타입이 있다.
1] UUID
- 많은 데이터베이스 및 시스템에서 ID로 사용되는 표준 "Universally Unique Identifier"이다.
- requests 및 responses에서
str
으로 표시된다.
2] datetime.datetime
- Python
datetime.datetime
이다. - requests 및 responses에서
2008-09-15T15:53:00+05:00
과 같이 ISO 8601 형식의str
으로 표시된다.
3] datetime.date
- Python
datetime.date
이다. - requests 및 responses에서
2008-09-15
과 같이 ISO 8601 형식의str
으로 표시된다.
4] datetime.time
- Python
datetime.time
이다. - requests 및 responses에서
14:23:55.003
과 같이 ISO 8601 형식의str
으로 표시된다.
5] datetime.timedelta
- Python
datetime.timedelta
이다. - requests 및 responses에서 초에 대한
float
으로 표시된다.
6] frozenset
- requests 및 responses에서
set
와 동일하게 처리된다. - requests에서 리스트를 읽어 중복을 제거하고
set
로 변환한다. - 그런 다음 responses에서
set
가list
로 변환된다.
7] bytes
- 표준 Python
bytes
이다. - requests 및 responses에서
str
으로 처리된다. - 생성된 스키마는
binary
형식의str
으로 지정한다.
8] Decimal
- 표준 Python
Decimal
이다. - requests 및 responses에서
float
과 동일하게 처리된다.
3. Example
- 다음의 예제는 위의 타입 중 일부를 사용하는 매개변수가 있는 path operation을 작성하는 예제이다.
from datetime import datetime, time, timedelta
from uuid import UUID
from typing import Optional
from fastapi import FastAPI, Body
app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: Optional[datetime] = Body(None),
end_datetime: Optional[datetime] = Body(None),
repeate_at: Optional[time] = Body(None),
process_after: Optional[timedelta] = 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,
"repeat_at": repeate_at,
"process_after": process_after,
"start_process": start_process,
"duration": duration,
}
- 함수 내부의 매개변수에는 고유한 데이터 타입이 있다.
- 또한 다음과 같이 날짜 연산 및 조작을 수행할 수 있다.
from datetime import datetime, time, timedelta
from typing import Optional
from uuid import UUID
from fastapi import FastAPI, Body
app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: Optional[datetime] = Body(None),
end_datetime: Optional[datetime] = Body(None),
repeate_at: Optional[time] = Body(None),
process_after: Optional[timedelta] = 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,
"repeat_at": repeate_at,
"process_after": process_after,
"start_process": start_process,
"duration": duration,
}