print(type(...)) # <class 'ellipsis'>
print(... is Ellipsis) # True
print(type(None)) # <class 'NoneType'>
아마도 여전히 꽤 많은 Python 개발자들에게 None
은 익숙하지만 Ellipsis
라는 것은 익숙하지 않을 것이다. Python의 Ellipsis는 특별한 내장 상수 객체로 세 개의 점 …
으로 표현된다. type(None)
이 NoneType
을 반환하듯, type(...)
은 Ellipsis
을 반환한다. 사전적으로 ‘ellipsis’는 '생략', '말줄임표'를 의미하는데, Python에서는 이 개념을 다차원 슬라이싱이나 타입 힌팅에 활용해 '무언가 더 있다' 또는 '아직 정의되지 않은 것'을 나타내곤 했다.
@app.get("/items/")
async def read_items(item_name: str):
pass
FastAPI에서 Query
를 이용해 파라미터 스펙을 정의할 때 Ellipsis
를 활용하는 방식은 Ellipsis 객체를 잘 활용한 사례로 손꼽힌다. 쿼리 파라미터를 정의할 때 개발자들은 종종 딜레마에 빠진다. item_name
라는 str
타입의 필수 파라미터를 입력받던 상황에서, 인자의 길이를 50자 이내로 제한하는 검증 로직을 추가하고 싶은 상황을 떠올려 보자.
@app.get("/items/")
async def read_items(item_name: Optional[str] = Query(None, max_length=50)):
pass
@app.get("/items/")
async def read_items(item_name: str = Query(None, max_length=50)):
pass
단순히 item_name: str
로 정의하면 필수 파라미터라는 요구 사항은 만족하지만 길이 제한 같은 추가 검증 로직을 적용할 수 없다. FastAPI는 Query
를 이용해 파라미터에 다양한 제약 조건들을 추가하는 기능을 제공하는데, 그렇다고 item_name: Optional[str] = Query(None, max_length=50)
처럼 하면 max_length
필드를 지정할 수 있어 길이 검증은 가능하게 되지만 None
에 의해 선택적 파라미터가 되어 필수성이 사라진다. item_name: str = Query(None, max_length=50)
으로 쓰면 되지 않나? 싶을 수 있지만, Optional
은 코드 에디터를 위한 문법일 뿐 실질적으로 코드의 작동에 주는 영향은 없다(ref1).
@app.get("/items/")
async def read_items(item_name: str = Query(None, max_length=50)):
assert item_name, "item_name은 필수입니다!"
pass
@app.get("/items/")
async def read_items(item_name: str = Query("", max_length=50)):
assert item_name, "item_name은 필수입니다!"
pass
물론 None
이나 빈 스트링 ‘’
을 지정하고, 함수 본문에서 명시적으로 assert item_name, ‘item_name 파라미터는 필수입니다!’
와 같은 부분을 추가하여 파라미터가 필수임을 알리는 것도 방법이다. 하지만 그렇게 한다면 FastAPI는 item_name
파라미터가 실제로 반드시 필요하다는 사실을 모른 채 API 문서에 item_name
이 선택적 파라미터이고 기본값이 빈 스트링이라고 알리고 있을 것이다. ‘’
도 아니고, None
도 아니고, 내가 말하고자 하는 바를 FastAPI에게 찰떡같이 전달하고 싶은데, 도대체 뭘 써야 할까?
@app.get("/items/")
async def read_items(item_name: str = Query(..., max_length=50)):
pass
이런 상황에서 Ellipsis 객체가 적합한 해결책을 제공한다. item_nama: str = Query(..., max_length=50)
와 같이 작성함으로써, 길이는 50자 이하여야 하면서도 이 파라미터는 반드시 필요하다는 의미를 FastAPI에게 알릴 수 있다. FastAPI는 이러한 Ellipsis의 사용을 해석하여, 해당 파라미터가 제공되지 않거나 검증 조건을 만족하지 않으면 자동으로 오류를 발생시켜 API의 안정성을 보장한다.
표현 | Query(표현) 의 의미 |
---|---|
’’ |
기본 ‘’ , 파라미터 입력 선택적 |
None |
기본 None , 파라미터 입력 선택적 |
… |
기본 없음, 파라미터 입력 강제 |
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.