인프런 커뮤니티 질문&답변

bluebamus님의 프로필 이미지
bluebamus

작성한 질문수

FastAPI 완벽 가이드

validator 데코레이터를 이용하여 커스텀 검증 로직 작성하기

pydactic 5강의 ValidationError의 인스턴스에 대한 질문입니다.

작성

·

11

0

ValidationError가 valueerror보다 인스턴스 생성하기가 쉽지 않기 때문에 valueerror를 사용하셨다고 말씀하신 부분이 있는데, 어떤 부분의 어려움이 있는 것인지 좀 더 자세히 알고 싶어 질문을 드립니다.

검색으로 해당 부분에 대한 내용을 찾아 보려 했으나 잘 이해하지 못한 상태인 제가 선정할 수 있는 검색어들 자체가 모호하여 정확한 결과를 얻기가 힘들었습니다.

 

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

pydantic의 ValidationError는 pydantic model이 생성될 때 검증 오류가 발생하면 던져 주는 Error입니다. 그런데 이걸 사용자가 직접 객체로 만들기가 복잡합니다.

예를 들어 ValidationError("Username must not be empty") 와 같은 방식으로 객체 생성 할 수가 없습니다. ValidationError 객체를 만들려면 내부 생성자로 ErrorWrapper 객체와 Pydantic model을 입력해 줘야 하는데, 이게 좀 복잡합니다. 그래서 ValidationError가 아니라 ValueError를 던져 주는게 더 효과적입니다. ValidationError는 ValueError를 상속받아서 만들어졌기 때문에 ValueError를 던져도 except ValidationError로 잡을 수 있습니다.

감사합니다.

bluebamus님의 프로필 이미지
bluebamus
질문자

글이 너무 어려워 제가 이해하는 부분들에 정리를 하고 싶어 글을 드립니다.

1. ValueError를 상속받아 ValidationError이 만들어 졌다

2. ValueError는 사용자가 직접 메시지를 정의하여 생성할 수 있지만 ValidationError는 ValidationError("Username must not be empty") 방식의 객체 생성이 불가하다.

3. 만약 이러한 객체를 생성하고자 한다면, 내부 생성자로 ErrorWrapper 객체와 Pydantic model을 입력하는 과정을 거쳐야 한다

위와 같은 이유로 코드상 ValueError(), RequestValidationError()를 사용하며 try ~ except 사용시에는 ValidationError를 검출용으로 정의할 수 있다.

예시 ) except ValidationError as e:

raise RequestValidationError(e.errors())

제가 이해하고 있는게 맞는지 알고 싶습니다.

그리고 pydactic에서 ValidationError()를 만든 목적은 무엇일까요?

권 철민님의 프로필 이미지
권 철민
지식공유자

네, 1, 2,3 번 다 맞습니다.

pydantic의 ValidationError를 만든 이유는 보다 상세한 오류 메시지를 생성하기 위함입니다. 어느 위치, 어떤 변수가 어떠한 형태로 오류가 발생하였는지를 error 정보로 가지고 있습니다. 그리고 이러한 ValidationError는 pydantic core 내부에서 만들어 지게 됩니다.

다만 강의의 실습 코드에서는 이러한 형태의 ValidationError를 사용자가 직접 만들기 어렵기 때문에 ValueError로 개요적인 오류 메시지만 입력하여 발생 시켰습니다.

보다 ValidationError에 대한 보다 자세한 내용은 아래 url을 참조하시면 좋을 것 같습니다.

https://docs.pydantic.dev/latest/errors/errors/

bluebamus님의 프로필 이미지
bluebamus

작성한 질문수

질문하기