Visual Studio Code
Pydantic은 표준 Python 유형 주석을 기반으로 만들어졌기 때문에 어떤 편집기나 IDE에서도 잘 작동합니다.
Visual Studio Code(VS Code)를 사용할 때 PyCharm 플러그인 에서 제공하는 기능과 유사한 몇 가지 추가 편집기 기능이 지원됩니다.
이는 새로운 Pydantic 모델 인스턴스를 생성하는 동안에도 유형 및 필수 인수에 대한 자동 완성 (또는 "IntelliSense") 및 오류 검사가 가능함을 의미합니다.
VS 코드 구성¶
이러한 기능을 활용하려면 권장 설정을 사용하여 VS Code를 올바르게 구성해야 합니다.
다른 구성이 있는 경우 단계에 대한 간략한 개요는 다음과 같습니다.
파이랜스 설치¶
VS Code용 Pylance 확장을 사용해야 합니다. 이는 권장되는 차세대 공식 Python용 VS Code 플러그인입니다.
Pylance는 기본적으로 VS Code용 Python 확장 의 일부로 설치되므로 아마도 제대로 작동할 것입니다. 그렇지 않으면 편집기에서 설치되어 활성화되었는지 다시 확인할 수 있습니다.
환경 구성¶
그런 다음 편집자가 Python 프로젝트에 대한 Python 환경 (아마도 가상 환경)을 알고 있는지 확인해야 합니다.
이것이 Pydantic을 설치한 환경입니다.
Pylance 구성¶
기본 구성을 사용하면 자동 완성이 지원되지만 Pylance는 유형 오류를 확인하지 않을 수 있습니다.
다음 단계를 통해 Pylance에서 유형 오류 검사를 활성화할 수 있습니다.
- "사용자 설정"을 엽니다.
Type Checking Mode
검색- 아래에서 옵션을 찾을 수 있습니다.
Python › Analysis: Type Checking Mode
basic
또는strict
으로 설정합니다(기본적으로는off
있음).
이제 새로운 Pydantic 모델 인스턴스를 생성할 때 자동 완성뿐만 아니라 필수 인수 에 대한 오류 검사도 받을 수 있습니다.
또한 유효하지 않은 데이터 유형 에 대한 오류 검사도 받게 됩니다.
!!! note "기술 세부 정보" Pylance는 VS Code 확장이며 비공개 소스이지만 무료로 사용할 수 있습니다. 그 아래에서 Pylance는 모든 무거운 작업을 수행하는 Pyright 라는 오픈 소스 도구(Microsoft에서도 제공)를 사용합니다.
You can read more about it in the [Pylance Frequently Asked Questions](https://github.com/microsoft/pylance-release/blob/main/FAQ.md#what-is-the-relationship-between-pylance-pyright-and-the-python-extension).
mypy 구성¶
또한 편집기에서 mypy 오류 검사를 인라인으로 가져오도록 VS Code에서 mypy를 구성할 수도 있습니다(Pylance 대신/추가로).
여기에는 Pydantic mypy 플러그인을 구성한 경우 감지된 오류가 포함됩니다.
VS Code에서 mypy를 활성화하려면 다음을 수행합니다.
- "사용자 설정"을 엽니다.
Mypy Enabled
검색- 아래에서 옵션을 찾을 수 있습니다.
Python › Linting: Mypy Enabled
- 확인란을 선택합니다(기본적으로 선택되어 있지 않음).
팁과 요령¶
다음은 Pydantic과 함께 VS Code를 사용할 때 개발자 경험을 개선하기 위한 몇 가지 추가 팁과 요령입니다.
엄격한 오류¶
이 추가 편집기 지원이 작동하는 방식은 Pylance가 Pydantic 모델을 Python의 순수 dataclasses
인 것처럼 처리하는 것입니다.
그리고 새로운 Pydantic 모델 인스턴스를 생성할 때 인수에 전달된 데이터 유형에 대한 엄격한 유형 오류 검사를 표시합니다.
이 예에서는 str
'23'
이 age
인수에 대해 유효한 int
아님을 보여줍니다.
age=23
age='23'
23 이 예상됩니다.
그럼에도 불구하고 Pydantic의 디자인과 주요 특징 중 하나는 데이터 유형에 매우 관대하다는 것입니다.
실제로 값이 '23'
인 str
허용하고 값이 23
인 int
로 변환합니다.
이러한 엄격한 오류 검사는 대부분의 경우 매우 유용 하며 많은 버그를 조기에 발견하는 데 도움이 될 수 있습니다. 그러나 age='23'
과 같이 "false positive" 오류를 보고하여 불편을 겪을 수 있는 경우가 있습니다.
age='23'
인 위의 예는 오류와 유형의 차이점을 보여주기 위해 의도적으로 단순합니다.
그러나 이러한 엄격한 오류가 불편한 더 일반적인 경우는 datetime
필드에 대한 int
값이나 Pydantic 하위 모델에 대한 dict
값과 같은 보다 정교한 데이터 유형을 사용할 때입니다.
예를 들어, 이는 Pydantic에 유효합니다:
from pydantic import BaseModel
class Knight(BaseModel):
title: str
age: int
color: str = 'blue'
class Quest(BaseModel):
title: str
knight: Knight
quest = Quest(
title='To seek the Holy Grail', knight={'title': 'Sir Lancelot', 'age': 23}
)
필드 기사의 유형 knight
Knight
클래스(Pydantic 모델)로 선언되며 코드는 대신 리터럴 dict
전달합니다. 이는 Pydantic에 여전히 유효하며 dict
자동으로 Knight
인스턴스로 변환됩니다.
그럼에도 불구하고 유형 오류로 감지됩니다.
이러한 경우 매우 특정 위치의 엄격한 오류를 비활성화하거나 무시하는 동시에 코드의 나머지 부분에서는 해당 오류를 유지하는 여러 가지 방법이 있습니다.
이를 달성하기 위한 몇 가지 기술은 다음과 같습니다.
라인에서 유형 검사를 비활성화합니다.¶
다음 주석을 사용하여 특정 줄에 대한 오류를 비활성화할 수 있습니다.
# type: ignore
또는 (pylance/pyright에 구체적으로):
# pyright: ignore
( pyright는 Pylance에서 사용하는 언어 서버입니다.)
age='23'
인 예로 다시 돌아가면 다음과 같습니다:
from pydantic import BaseModel
class Knight(BaseModel):
title: str
age: int
color: str = 'blue'
lancelot = Knight(title='Sir Lancelot', age='23') # pyright: ignore
그런 식으로 Pylance와 mypy는 해당 줄의 오류를 무시합니다.
장점 : 해당 줄을 간단히 변경하면 오류를 제거할 수 있습니다.
단점 : 유형 검사, 철자가 틀린 인수, 필수 인수가 제공되지 않은 등 해당 줄의 다른 오류도 생략됩니다.
변수 유형 재정의¶
사용하려는 값으로 변수를 생성하고 Any
사용하여 해당 유형을 명시적으로 선언할 수도 있습니다.
from typing import Any
from pydantic import BaseModel
class Knight(BaseModel):
title: str
age: int
color: str = 'blue'
age_str: Any = '23'
lancelot = Knight(title='Sir Lancelot', age=age_str)
그런 식으로 Pylance와 mypy는 int
가 예상될 때 str
유형이 있다는 것을 아는 대신(그리고 해당 오류를 표시하는) age_str
변수를 해당 유형을 모르는 것처럼 해석합니다.
장점 : 특정 값에 대해서만 오류가 무시되며 다른 인수에 대해서는 추가 오류가 계속 표시됩니다.
단점 : 오류를 무시해야 하는 각 인수에 대해 새 줄에 Any
및 새 변수를 가져와야 합니다.
cast
사용하여 값 유형 재정의¶
이전 예제와 동일한 아이디어를 cast()
의 도움으로 같은 줄에 넣을 수 있습니다.
이렇게 하면 다른 변수가 필요 없이 값의 유형 선언이 인라인으로 재정의됩니다.
from typing import Any, cast
from pydantic import BaseModel
class Knight(BaseModel):
title: str
age: int
color: str = 'blue'
lancelot = Knight(title='Sir Lancelot', age=cast(Any, '23'))
cast(Any, '23')
값에 영향을 주지 않고 여전히 '23'
이지만 이제 Pylance와 mypy는 Any
유형이라고 가정합니다. 즉, 유형을 모르는 것처럼 행동합니다. 가치의.
따라서 이는 추가 변수가 없는 이전 예제와 동일합니다.
장점 : 특정 값에 대해서만 오류가 무시되며 다른 인수에 대해서는 추가 오류가 계속 표시됩니다. 추가적인 변수는 필요하지 않습니다.
단점 : Any
및 cast
가져와야 하며, cast()
사용에 익숙하지 않은 경우 처음에는 이상하게 보일 수 있습니다.
클래스 인수의 구성¶
Pydantic에는 다양한 모델 구성 세트가 있습니다.
이러한 구성은 각 모델의 내부 class Config
에서 설정할 수 있습니다.
from pydantic import BaseModel
class Knight(BaseModel):
model_config = dict(frozen=True)
title: str
age: int
color: str = 'blue'
또는 모델 클래스를 정의할 때 키워드 인수로 전달됩니다.
from pydantic import BaseModel
class Knight(BaseModel, frozen=True):
title: str
age: int
color: str = 'blue'
frozen
특정 구성(베타)에는 특별한 의미가 있습니다.
모델 인스턴스가 생성되면 다른 코드가 모델 인스턴스를 변경하는 것을 방지하여 "동결" 상태로 유지합니다.
두 번째 버전을 사용하여 frozen=True
(클래스 정의의 키워드 인수 포함)를 선언하는 경우 Pylance는 이를 사용하여 코드를 확인하고 "동결"된 모델에서 값을 설정하려고 할 때 오류를 감지하는 데 도움을 줄 수 있습니다.
Field
사용하여 기본값 추가¶
Pylance/pyright에서는 필드가 선택 사항임을 추론하기 위해 default
Field
에 대한 키워드 인수가 되도록 요구합니다.
from pydantic import BaseModel, Field
class Knight(BaseModel):
title: str = Field(default='Sir Lancelot') # this is okay
age: int = Field(
23
) # this works fine at runtime but will case an error for pyright
lance = Knight() # error: Argument missing for parameter "age"
이는 데이터 클래스 변환의 제한 사항이며 pydantic에서는 수정할 수 없습니다.
기술적인 세부사항¶
!!! 경고 Pydantic 사용자로서 아래 세부 정보가 필요하지 않습니다. 이 섹션의 나머지 부분은 건너뛰어도 됩니다.
These details are only useful for other library authors, etc.
이 추가 편집기 지원은 Dataclass Transform(PEP 681) 에 대해 제안된 초안 표준을 구현하여 작동합니다.
제안된 표준 초안은 오픈 소스 패키지 Pyright(VS Code에서 Python 지원을 제공하기 위해 Pylance에 사용됨)의 동일한 작성자이자 Microsoft 팀의 Eric Traut가 작성했습니다.
표준의 목적은 Pydantic과 같은 라이브러리가 편집자와 도구에게 이러한 라이브러리(예: Pydantic)를 마치 dataclasses
인 것처럼 처리해야 함을 알려주고 자동 완성, 유형 검사 등을 제공하는 방법을 제공하는 것입니다.
표준 초안에는 Pydantic과 같은 얼리 어답터가 새 표준 초안이 완료되고 승인되기 전에도 즉시 지원을 추가할 수 있는 대체 양식 도 포함되어 있습니다.
대체 형식이 포함된 이 새로운 초안 표준은 이미 Pyright에서 지원되므로 VS Code의 Pylance를 통해 사용할 수 있습니다.
Python의 공식 표준으로 제안되고 있으므로 다른 편집자도 쉽게 지원을 추가할 수 있습니다.
그리고 Pydantic과 유사한 다른 라이브러리의 작성자도 쉽게 표준을 즉시 채택하고("대체 형식" 사용) 이러한 추가 편집기 기능의 이점을 얻을 수 있습니다.
本文总阅读量次