print(type(...)) # <class 'ellipsis'>
print(... is Ellipsis) # True
print(type(None)) # <class 'NoneType'>
Python
복사
아마도 여전히 꽤 많은 Python 개발자들에게 None은 익숙하지만 Ellipsis라는 것은 익숙하지 않을 것이다. Python의 Ellipsis는 특별한 내장 상수 객체로 세 개의 점 … 으로 표현된다. type(None)이 NoneType을 반환하듯, type(...)은 Ellipsis을 반환한다. 사전적으로 ‘ellipsis’는 '생략', '말줄임표'를 의미하는데, Python에서는 이 개념을 다차원 슬라이싱이나 타입 힌팅에 활용해 '무언가 더 있다' 또는 '아직 정의되지 않은 것'을 나타내곤 했다.
@app.get("/items/")
async def read_items(item_name: str):
pass
Python
복사
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
Python
복사
단순히 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
Python
복사
물론 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
Python
복사
이런 상황에서 Ellipsis 객체가 적합한 해결책을 제공한다. item_nama: str = Query(..., max_length=50)와 같이 작성함으로써, 길이는 50자 이하여야 하면서도 이 파라미터는 반드시 필요하다는 의미를 FastAPI에게 알릴 수 있다. FastAPI는 이러한 Ellipsis의 사용을 해석하여, 해당 파라미터가 제공되지 않거나 검증 조건을 만족하지 않으면 자동으로 오류를 발생시켜 API의 안정성을 보장한다.
표현 | Query(표현)의 의미 |
’’ | 기본 ‘’, 파라미터 입력 선택적 |
None | 기본 None, 파라미터 입력 선택적 |
… | 기본 없음, 파라미터 입력 강제 |
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
1.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
1.
2.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.
1.
None
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는지 연결합니다.
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되거나 이어지는지를 작성하는 영역입니다.
1.
None
ref : 생각에 참고한 자료입니다.