반응형

참조: https://pydantic-docs.helpmanual.io/usage/models/

Pydantic 에러 처리  

 

정리. 수알치 오상문

 

pydantic 데이터 검증(Validation) 단계에서 오류 발견되면 ValidationError 에러를 발생시킨다.

 

-----------------------------------------------------------------------------------------------------------

[참고] 유효성 검사 코드는 ValidationError 자체를 발생시키기 보다는 ValidationError 채우는 사용할 ValueError, TypeError 또는 AssertionError(또는 ValueError 또는 TypeError 하위 클래스) 발생시켜야 한다.

--------------------------------------------------------------------------------------------------------------

 

다음과 같은 방법으로 발생한 오류에 접근할 있다.

 

e.errors() : 입력 데이터에서 발견된 오류 목록을 반환하는 메서드

e.json() : 발생한 에러의 JSON 표현을 돌려주는 메서드

str(e) : 에러 내용을 읽기 좋은 표현으로 반환하는 메서드

 

에러 객체는 다음 내용을 포함한다.

 

Loc : 목록에서 발생한 에러 위치이다. 목록 항목은 오류 발생 필드가 되고 필드가 하위 모델(sub-model) 경우 후속 항목이 표시되어 오류 중첩 위치를 나타낸다.

Type : 에러 타입이다.

Msg : 에러 메시지이다.

Ctx : 메시지 추가 옵션 정보이다.

 

다음 예제는 모델 초기화를 하는 작업에서 모델 필드와 맞지 않는 값의 초기화에서 발생하는 에러를 처리한다.

 

[예제]

from typing import List
from pydantic import BaseModel, ValidationError, conint
class Location(BaseModel):
    lat = 0.1
    lng = 10.1
class Model(BaseModel):
    is_required: float
    gt_int: conint(gt=42)  # greater than 42
    list_of_ints: List[int] = None
    a_float: float = None
    recursive_model: Location = None
data = dict(
    list_of_ints=['1', 2, 'bad'], 
    a_float='not a float', 
    recursive_model={'lat': 4.2, 'lng': 'New York'}, 
    gt_int=21, 
)
try:
    Model(**data) # 모델에 data사전을 키-값 쌍 필드로 초기화
except ValidationError as e:
    print(e)  # 에러 객체 메시지 출력하기 
[출력 결과] -----------------------------------------
5 validation errors for Model
    is_required
      field required (type=value_error.missing)
    gt_int
      ensure this value is greater than 42 (type=value_error.number.not_gt;
    limit_value=42)
    list_of_ints -> 2
      value is not a valid integer (type=type_error.integer)
    a_float
      value is not a valid float (type=type_error.float)
    recursive_model -> lng
      value is not a valid float (type=type_error.float)
------------------------------------------------------------
try:
    Model(**data) # 모델에 data사전을 키-값 쌍 필드로 초기화
except ValidationError as e:
    print(e.json())  # JSON 표현으로 에러 메시지 출력하기 
[출력 결과] ------------------------------------------------   
    [
      {
        "loc": [
          "is_required"
        ],
        "msg": "field required",
        "type": "value_error.missing"
      },
      {
        "loc": [
          "gt_int"
        ],
        "msg": "ensure this value is greater than 42",
        "type": "value_error.number.not_gt",
        "ctx": {
          "limit_value": 42
        }
      },
      {
        "loc": [
          "list_of_ints",
          2
        ],
        "msg": "value is not a valid integer",
        "type": "type_error.integer"
      },
      {
        "loc": [
          "a_float"
        ],
        "msg": "value is not a valid float",
        "type": "type_error.float"
      },
      {
        "loc": [
          "recursive_model",
          "lng"
        ],
        "msg": "value is not a valid float",
        "type": "type_error.float"
      }
    ]
    -----------------------------------------------------------------------------

 

 

반응형

+ Recent posts