[Python] dataclass와 pydantic 어떤걸 써야할까?

devhans·2024년 7월 5일

Python

목록 보기
5/8
post-thumbnail

Pydantic과 dataclasses는 각각의 장단점이 있으며, 특정 용도와 요구사항에 따라 더 적합한 선택이 달라질 수 있습니다. 다음은 두 접근 방식의 비교입니다.

dataclass와 Pydantic의 비교

dataclass

장점

경량화:
표준 라이브러리에서 제공되므로 추가 종속성이 필요 없습니다.
가벼운 클래스 정의와 데이터 저장용으로 적합합니다.
간결성:
간단한 데이터 모델을 생성할 때 문법이 간결하고 직관적입니다.
성능:
비교적 빠르며, 성능에 민감한 경우 유리할 수 있습니다.
유연성:
유효성 검사 없이, 단순히 데이터를 저장할 구조가 필요할 때 적합합니다.

단점

유효성 검사 제한:
데이터 유효성 검사나 타입 강제에 대한 기본적인 지원이 없습니다. 추가적인 유효성 검사가 필요하다면 직접 구현해야 합니다.
데이터 직렬화/역직렬화:
JSON이나 다른 포맷으로의 직렬화/역직렬화 기능이 기본적으로 제공되지 않으며, 추가 코드가 필요합니다.

Pydantic

장점

유효성 검사:
필드 타입 검증 및 조건을 쉽게 설정할 수 있습니다. 입력 데이터의 유효성 검사와 변환이 자동으로 처리됩니다.
데이터 직렬화/역직렬화:
JSON 등 다양한 포맷의 데이터를 쉽게 직렬화 및 역직렬화할 수 있습니다.
타입 강제:
필드에 대한 타입 강제 및 데이터 변환 기능을 자동으로 처리합니다. 예를 들어, 문자열을 정수로 변환하거나, 잘못된 데이터 타입을 처리할 수 있습니다.
데코레이터와 유틸리티:
다양한 추가 기능과 데코레이터를 제공하여, 필드의 기본값 설정, 필드의 별칭 설정, 조건부 필드 등의 사용이 가능합니다.

단점

추가 종속성:
pydantic 패키지를 설치해야 합니다. 이는 프로젝트의 종속성을 증가시킬 수 있습니다.
성능:
데이터 검증과 타입 강제 기능 때문에 dataclass에 비해 성능이 떨어질 수 있습니다. 성능이 매우 중요한 애플리케이션에서는 주의해야 합니다.
복잡성:
더 많은 기능을 제공하기 때문에 문법이 다소 복잡할 수 있으며, 작은 프로젝트에는 과도할 수 있습니다.

비교 요약

특징dataclassPydantic
불변성객체를 불변으로 만듭니다제공하지 않습니다
유효성 검사제공하지 않습니다강력한 유효성 검사 기능
타입 강제제공하지 않습니다자동 타입 강제 및 변환
데이터 직렬화/역직렬화기본적으로 제공하지 않습니다강력한 직렬화/역직렬화 기능
성능상대적으로 빠릅니다상대적으로 느릴 수 있습니다
(rust로 작성되어 충분히 빠릅니다)
추가 종속성없습니다pydantic 라이브러리 필요

사용 예시

dataclass

from dataclasses import dataclass, asdict

@dataclass
class Product():
    id: int
    name: str
    price: float

if __name__ == '__main__':
    # 객체 생성
    product = Product(id=123, name="goods", price=1234.5)

    # 딕셔너리로 직렬화( asdict라는 추가 코드가 필요하다 )
    product_dict = asdict(product)
    print(product_dict)

    # 객체로 역직렬화
    product_from_dict = Product(**product_dict)
    print(product_from_dict)

실행결과:

pydantic

from pydantic import BaseModel

class Product(BaseModel):
    id: int
    name: str
    price: float


if __name__ == '__main__':
    # 객체 생성
    product = Product(id=123, name="goods", price=1234.5)

    # 딕셔너리로 직렬화
    product_dict = product.dict()
    print(product_dict)

    # 객체로 역직렬화
    product_from_dict = Product(**product_dict)
    print(product_from_dict)

실행 결과:

결론

타입을 강제해야한다면 pydantic을 도입을 고려해야 합니다.
굳이 강제할 필요가 없는 코드라면 @dataclass를 쓰는것 만으로 충분합니다.

profile
책 읽고 운동하기

0개의 댓글