Search
🌍

FastAPI의 파라미터 검증 코드에서 Ellipsis는 None이 차마 담지 못하는 의미를 표현하는 일에 사용된다.

🚀 prev note
♻️ prev note
🚀 next note
♻️ next note
16 more properties
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 : 생각에 참고한 자료입니다.