Pydantic를 사용하여 Python에서 데이터 분석 및 검증

유형 암시의 도입은 파이톤의 많은 위대한 새로운 특성에 문을 열었다.유형 힌트를 사용하면 데이터 검증과 해석이 더욱 쉽다.Pydantic은 실행할 때 형식 알림을 강제로 실행하는 패키지입니다.그것은 개발자가 잘못된 데이터를 포착할 수 있도록 오류를 던졌다.
Pydantic는 유형 검사와 검증뿐만 아니라 속성에 제약을 추가하고 Python 변수에 사용자 정의 검증을 만들 수 있습니다.그것은 모델의 유형과 제약이 이미 응용되고 데이터가 유효하다는 것을 보장한다.
이것은 특히 우리가 복잡한 끼워 넣은 데이터가 있을 때 매우 유용하다.JSON을 사전으로 해석할 필요가 없습니다.우리는 Pydantic를 사용하여 더 좋은 유형화 코드를 얻을 수 있고, 더 적은 오류를 확보하기 위해 검증기를 추가할 수 있다.
주의해야 할 것은 Pydantic와 Pyright의 차이점은 데이터 검증을 실행하고 실행할 때 입력 데이터를 해석하는 데 있다.다른 한편, Pyright는 정적 유형 검사기로서 이렇게 할 줄만 안다.이 두 가지 도구는 더 튼튼한 파이톤 코드를 얻기 위해 함께 사용할 수 있다.

초기 설정


파이톤의 모든 내용과 마찬가지로, 우리는 모든 새로운 프로젝트에 Python virtual environment를 설정해야 한다.Pydantic를 설치하려면 pip을 사용하십시오.
python -m pip install pytest
먼저 데이터클래스 decorator를 사용하여 코드를 작성합시다.데이터클래스 decorator는 Python 3.7에 도입된 것으로, 예를 들어 init 방법과 같은 샘플 코드를 줄일 수 있습니다.그것들은 또한 우리의 속성에 대해 유형 알림을 사용할 수 있습니다.따라서 블로그 데이터 클래스를 만듭니다.
from dataclasses import dataclass
from typing import Tuple

@dataclass
class Blog:
    title: str
    author: str
    categories: Tuple[str,...]
Tuple[str,...] 은 문자열 유형의 원조를 나타내며 원소의 수량이 변할 수 있습니다.
선택할 수 있는 유형이 하나도 없기 때문에, 우리는 어떤 유형도 이 유형에 분배해서는 안 된다.이것은 블로그 글에 제목, 작가, 분류가 필요하다는 것을 의미한다.그러나 우리가 그것들에 값을 부여하지 않는다면 어떤 잘못도 던지지 않을 것이다.
def main():
    blog = Blog(title=None, author=None, categories=None)
    print(blog)
우리는 출력을 얻었다.
Blog(title=None, author=None, categories=None)
유형 힌트는 선택 사항이기 때문에 오류가 발생하지 않습니다. 파이톤은 그것들을 강제로 실행하지 않습니다.API 엔드포인트에서 이러한 데이터를 가져오는 경우 데이터가 로직을 수행하기 전에 먼저 해당 데이터를 검증하기를 원합니다.여기가 바로 단티치를 화면에 넣는 곳이다.

Pydantic 모델 생성하기


pydantic에서 가져올 데이터클래스 속성을 바꿀 수 있습니다. 이 변경 사항만 사용하면 검증 오류를 볼 수 있습니다.
from pydantic.dataclasses import dataclass
그러면 오류가 발생합니다.

Pydantic에서는 유형 변환을 지원합니다.따라서, 만약 우리가 값 "2"를 int 필드에 전달한다면, 오류를 던지지 않고 변환될 것입니다.
그러나 데이터류는 한계가 있다.Pydantic는 우리가 확장할 수 있는 BaseModel 클래스를 제공합니다.이렇게 하면 서열화와 일류 JSON 지원 등의 기능을 제공할 수 있다.따라서 코드는 다음과 같이 변환됩니다.
from pydantic import BaseModel
from typing import Tuple

class Blog(BaseModel):
    title: str
    author: str
    categories: Tuple[str,...]

def main():
    blog = Blog(title=None, author=None, categories=None)
    print(blog)

main()
추가 기능 때문에 BaseModel 구현이 더 나은 방법일 수 있습니다.그러나 주의해야 할 것은 데이터클래스 장식기와 extend from Base Model을 동시에 놓아서는 안 된다는 것이다. 왜냐하면 이것은 작용하지 않기 때문이다.
또 하나 주의해야 할 것은 BaseModel은 키워드 파라미터가 필요하기 때문에 데이터클래스에 효과가 있지만:
blog=Blog("Hello World","Saransh Kataria",("Wisdom","Geek"))
BaseModel의 경우 키워드 매개 변수가 명확해야 합니다.
blog=Blog(title="Hello World",author="Saransh Kataria",categories=("Wisdom","Geek"))
또는 우리는 **kwargs를 사용하여 실현할 수 있다.

Pydantic 및 JSON 기능


JSON() 함수를 사용하여 Pydantic 모델을 JSON 문자열로 변환할 수 있습니다.
print(blog.json())

# {"title": "Hello World", "author": "Saransh Kataria", "categories": ["Wisdom", "Geek"]}
parse raw 함수를 사용하여 JSON을 Pydantic 모델로 해석할 수 있습니다.
blog = Blog.parse_raw('{"title": "Hello World", "author": "Saransh Kataria", "categories": ["Wisdom", "Geek"]}')
print(blog.title)

# Hello World
모든 유효성 검사는 JSON 확인 시 수행됩니다.구문 분석 중에 오류가 발생하면 해당 오류에 대한 우호적인 메시지가 있는 ValidationError가 표시됩니다.

사용자 정의 유효성 검사 추가


만약 우리가 작가가 최대 5편의 문장만 발표하기를 희망한다고 가정한다면.여러 게시물 필드를 추가하여 검증합니다.이를 위해서는 Pydantic의 Field 함수를 사용해야 합니다.
그리고 우리는 이 필드 함수를 이용하여 첫 번째 인자를 변수에 제공하고자 하는 기본값으로 받아들이려고 합니다.기본값을 지정하거나 "..."을 사용하여 필수 필드로 지정할 수 있습니다.이 예에서 우리는 0을 지정할 것이다.나머지 매개 변수는 우리가 지정하고자 하는 검증일 수 있으며, 필드에서 검사해야 합니다.우리는 gt=0과 lt=5를 사용하여 이 값이 0보다 크거나 작거나 5보다 작아야 한다고 지정할 것이다.
from pydantic import BaseModel, Field

class Blog(BaseModel):
    number_of_posts: int = Field(0,gt=0,lt=5)

def main():
    blog=Blog(number_of_posts=2)
    print(blog.json())

main()

# {"number_of_posts": 2}
하면, 만약, 만약...
blog=Blog(number_of_posts=2)


Traceback (most recent call last):
  File "pydanticdemo.py", line 10, in <module>
    main()
  File "pydanticdemo.py", line 7, in main
    blog=Blog(number_of_posts=10)
  File "/Users/saranshkataria/pydantic/.venv/lib/python3.7/site-packages/pydantic/main.py", line 400, in __init__
    raise validation_error
pydantic.error_wrappers.ValidationError: 1 validation error for Blog
number_of_posts
  ensure this value is less than 5 (type=value_error.number.not_lt; limit_value=5)
검증에 실패했기 때문에, 우리는 값 오류를 보았다.사용자 정의 검사가 내장 검사와 다르기를 원한다면,validator decorator를 가져올 수 있습니다.그리고 우리는 함수를 만들어서 속성을 검증할 수 있다.검증기 장식기는 속성의 이름을 검증하고 함수는 수신 클래스와 속성을 매개 변수로 합니다.
from pydantic import BaseModel, validator

class Blog(BaseModel):
    name: str

    @validator('name')
    def check_name_length(cls, name):
        if(len(name) < 3):
            raise ValueError('name too short')
        return name

def main():
    blog=Blog(name="SK")
    print(blog.json())

main()
우리는 이름 필드의 길이가 3보다 커야 한다고 요구한다.이런 상황이 아니었기 때문에, 우리는 잘못을 얻었다.
Traceback (most recent call last):
File "pydanticdemo.py", line 16, in <module>
main()
File "pydanticdemo.py", line 13, in main
blog=Blog(name="SK")
File "/Users/saranshkataria/pydantic/.venv/lib/python3.7/site-packages/pydantic/main.py", line 400, in init
raise validation_error
pydantic.error_wrappers.ValidationError: 1 validation error for Blog
name
name too short (type=value_error)

마무리


이것은 Pydantic가 우리의 데이터 클래스와 대상 모델의 표면을 검증하는 데 어떻게 사용되는지에 불과하다.Pydantic를 사용하면 많은 일을 할 수 있습니다. 당신은 반드시 docs를 가서 더 많은 정보를 알아야 합니다!질문이 있으시면 언제든지 연락 주세요.
최초는 2021년 3월 23일https://www.wisdomgeek.com에 발표됐다.

좋은 웹페이지 즐겨찾기