일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- github
- IAM
- FastAPI
- 자바스크립트
- WSGI
- leetcode
- EC2
- 쿠버네티스
- intervals
- elasticsearch
- EKS
- Python
- dockerfile
- event loop
- ebs
- Deployment
- Django
- ansible
- K8S
- POD
- Kubernetes
- asyncio
- IAC
- asgi
- Service
- AWS
- terraform
- DevOps
- YAML
- docker
- Today
- Total
궁금한게 많은 개발자 노트
[ Python ] pydantic 본문
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 |