✅ 문제 발생
개발 중 fastapi UploadFile 타입으로 받은 파일 데이터를 다루는 부분이있었다.
그곳에서 type을 확인 해야되는 일이 생겼는데 isinstance가 작동하지 않는 문제가 발생했다.
디버깅을 위해 type을 찍어보니 starlette.datastructures.UploadFile이라고 나온다.
🔍 원인 분석(chat gpt)
- FastAPI와 Starlette의 UploadFile 참조 차이
- fastapi.UploadFile은 사실 starlette.datastructures.UploadFile의 **별칭(alias)**일 뿐, 직접 정의된 클래스가 아님.
- 실행 환경에 따라 fastapi.UploadFile과 starlette.datastructures.UploadFile이 서로 다른 객체로 인식될 가능성이 있음.
- 즉, isinstance()가 예상대로 동작하지 않을 수 있음.
- 모듈 import 방식 차이
- Python에서는 같은 이름의 클래스라도 import 경로가 다르면 다른 객체로 인식됨.
- fastapi.UploadFile과 starlette.datastructures.UploadFile이 다르게 취급되면서 isinstance() 검사가 실패할 가능성이 있음.
from fastapi import FastAPI, UploadFile
app = FastAPI()
@app.post("/upload")
async def upload_file(file: UploadFile):
return isinstance(file, UploadFile) # False
그 말인즉 해당 객체가 직접적으로 해당 클래스의 인스턴스가 아니라,
FastAPI 내부적으로 wrapping 되어 있어서 발생한다는 이야기다.
그래서 starlette에서 UploadFile을 직접 import 하였다.
from fastapi import FastAPI
from starlette.datastructures import UploadFile
app = FastAPI()
@app.post("/upload")
async def upload_file(file: UploadFile):
return isinstance(file, UploadFile) # True
'python' 카테고리의 다른 글
Ruff 소개 및 활용, Python 코드 품질 관리 (0) | 2025.04.02 |
---|---|
pip으로 Poetry 설치하고 설정하는 가이드 (3) | 2024.11.20 |
use-implicit-booleaness-not-comparison: Pythonic 코드 작성법 (0) | 2024.11.12 |
Fastapi 애플리케이션 로깅 : YAML 설정으로 로깅 구성하는 법(timestamp 추가) (5) | 2024.10.31 |
파이썬 파일 경로 처리: splitext로 파일명과 확장자 쉽게 분리하기 (0) | 2024.09.10 |