궁금한게 많은 개발자 노트

[ Python ] pydantic 본문

Back End

[ Python ] pydantic

궁금한게 많은 개발자 2022. 5. 24. 20:01

pydantic은 type annotation을 사용해서 데이터를 검증하고 설정들을 관리하는 library이다.

runtime에서 type을 강제하고, type이 유효하지 않을 때 에러를 발생시킵니다. 

 

Fast API를 공부하다가, pydantic을 사용한다고 하여 함께 정리해보게 되었습니다. (type hint사용)

Type hint는 parameter값이 어떤 자료형으로 들어와야 하는지 코드 상에서 명시하는 것입니다.

 

 

[ parsing library ]

pydantic은 vaildation library가 아닌 parsing 라이브러리입니다.

유효성 검사는 제공된 유형 및 제약 조건을 준수하는 모델을 구축하는 목적을 달성하기 위한 수단입니다.

즉, pydnatic은 입력 데이터가 아닌 출력모델의 유형과 제약 조건을 보장합니다.

 

from pydantic import BaseModel

class Model(BaseModel):
    a: int
    b: float
    c: str

print(Model(a=3.1415, b=' 2.72 ', c=123).dict())
#> {'a': 3, 'b': 2.72, 'c': '123'}

print(Model(a=3.1415, **b=' asd '**, c=123).dict())
'''
pydantic.error_wrappers.ValidationError: 1 validation error for Model
b
  value is not a valid float (type=type_error.float)
'''

위에서 볼 수 있듯이 b의 float값이 string으로 들어와도 이를 float로 parsing해줍니다. 하지만, parsing이 불가능한 데이터가 들어왔을 경우에는 error를 발생시킵니다.

 

 

 

 

[ BaseModel ]

pydantic에서 객체를 정의하는 것은 BaseModel에서 상속되는 새 클래스를 만드는 것만큼 간단합니다.

클래스에서 새 객체를 생성할 때, pydantic은 결과 모델 인스턴스가 모델에 정의된 필드 유형을 준수하도록 보장합니다.

class User(BaseModel):
    id: int
    username : str
    password : str
    confirm_password : str
    alias = 'anonymous'
    timestamp: Optional[datetime] = None
    friends: List[int] = []

id - 이산형 변수는 ID를 표현합니다. 기본값은 제공하지 않기 때문에, 이 필드는 반드시 필요하고, 객체 생성할 때 정의가 되어야 합니다. 문자열, 바이트 또는 부동 소수점은 가능한 경우 정수로 강제 변환됩니다. 그렇지 않으면 예외가 발생합니다.
username - 문자형 변수는 username을 표현합니다. 그리고 이 필드는 반드시 필요합니다.
password - 문자형 변수는 password을 표현합하니다. 그리고 이 필드는 반드시 필요합니다.
confirm_password - 문자형 변수는 confirmation password를 표현합니다. 반드시 필요하고, 후에 데이터 검증을 위해서 사용됩니다.
alias - 문자형 변수는 alias를 표현합니다. 이것은 반드시 필요하지 않고, 설정하지 않으면 anonymous로 설정됩니다.
timestamp - date/time field를 의미하고, 반드시 필요하지는 않고, 기본 값은 None입니다.
friends - 이산형 변수들의 리스트를 의미합니다. 기본값은 []입니다.

 

Methods and attributes under BaseModel
BaseModel을 상속한 Class들은 다음 method들과 attribute들이 있습니다.

dict() — returns a dictionary of the model’s fields and values
json() — returns a JSON string representation dictionary
copy() — returns a deep copy of the model
parse_obj() — a utility for loading any object into a model with error handling if the object is not a dictionary
parse_raw() — a utility for loading strings of numerous formats
parse_field() — similar to parse_raw() but meant for files
from_orm() — loads data into a model from an arbitrary class
schema() — returns a dictionary representing the model as JSON schema
schema_json() — returns a JSON string representation of schema()
construct() — a class method for creating models without running validation
__fields_set__ — Set of names of fields which were set when the model instance was initialized
__fields__ — a dictionary of the model’s fields
__config__ — the configuration class for the model

 

 

 

[ pydantic을 사용하는 이유 ]

1. 데이터 모델을 정의할 수 있는 간단한 syntax 

- BaseModel 클래스에서 상속된 클래스 내에서 데이터를 정의할 수 있습니다. pydantic model은 데이터를 수집하고 구문 분석하고 데이터에 정의된 필드가 제약 조건을 준수하는지 확인하는 구조입니다.

2. 사용자 친화적 error message

3. filed customization (custom validators)

- pydantic을 사용하여 각 필드를 Field클래스 내부에 wrapping하여 기본적으로 유효성 검사를 추가할 수 있습니다.

4. 많은 유용한 method들을 제공

5. 환경변수값을 parsing하여 사용 가능

- .env파일에서 환경 변수를 읽고 BaseSettings클래스 내에서 직접 구문 분석이 가능합니다.

 

'Back End' 카테고리의 다른 글

[ Python ] FastAPI - Depends  (0) 2022.06.03
SQLalchemy  (0) 2022.05.26
[ Python ] 병렬 처리 concurrent future  (4) 2022.05.23
Fast API  (0) 2022.05.23
django model 간 관계  (0) 2022.05.19
Comments