ã¯ããã«
æè¿ããããã£ã¹ãèŽãæéãå°ãæžã£ãŠããŸã£ããã ãã©ãä¹ ãã¶ãã« Talk Python to Me ãèŽãããPydanticã®è©±é¡ã§ããïŒãšããœãŒãã®ãªã³ã¯ã¯ãã¡ãïŒãäœè ã®Samuel Colvinãããç§ã«äºå®ããŠããã¡ãžã£ãŒããŒãžã§ã³ã¢ããã®è©±ããå§ããã®ã§ãããåé ã§ãã³ã¢ãRustã§å®è£ ããŠ17åéããªãããšèšã£ãŠããŠããªã³ã¯åŒµãããŠããããã¥ã¡ã³ããèªã¿ãŸããããã®èšäºã¯ããã§èªãããŠããå 容ãäžå¿ã«Pydantic v2ã«ã€ããŠã玹ä»ããŸãã
Pydanticãšã¯
v2ã®è©±ã®åã«ãããããPydanticãšã¯äœãã«ã€ããŠç°¡åã«è§ŠããŠãããŸããPydanticã¯Pythonã®åãã³ãæ å ±ã䜿ã£ãŠããŒã¿ããªããŒã·ã§ã³ïŒããŒã¿ã®åŠ¥åœæ§æ€èšŒïŒãè¡ãã©ã€ãã©ãªã§ããäºãããŒã¿ã®æ§é ãå®çŸ©ããŠãããŠãå ¥åãããããŒã¿ããã®æ§é ã«åã£ãŠãããã調ã¹ãŠãããŸãã
äŸãã°ãidïŒæŽæ°ïŒãšnameïŒæååïŒã®äºã€ã®ãã£ãŒã«ããæã€ããŒã¿æ§é ãèããŸããããã Pydanticã®ã¢ãã«ã§å®çŸ©ãããšãããªããŸãã
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = "John Doe"
BaseModelãšããã¯ã©ã¹ãç¶æ¿ããŠãã¯ã©ã¹ã«åãã³ãä»ãã§å®çŸ©ããã ãã§ããnameã«ã¯ããã©ã«ãå€ãšã㊠"John Doe"ãèšå®ãããŠããŸããããã䜿ã£ãŠå¹Ÿã€ã詊ããŠã¿ãŸãã
>>> userdata = {
... "id": 123,
... "name": "Taro Yamada",
... }
>>> user = User(**userdata)
>>> user
User(id=123, name='Taro Yamada')
>>> user.id
123
>>> user.name
'Taro Yamada'
åé¡ãªã Userã¯ã©ã¹ã®ããŒã¿ãšããŠåã蟌ããŠããŸããäžæ¹ã§ãidãæ¬ ããããŒã¿ã䜿ã£ãŠããŸãã
>>> userdata = {
... "name": "Taro Yamada",
... }
>>> user = User(**userdata)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for User
id
field required (type=value_error.missing)
ãidãšãããã£ãŒã«ããå¿
èŠã ãããšãããšã©ãŒã«ãªããŸããã¡ãªã¿ã«ã nameãæ¬ ããããŒã¿ã䜿ããšããã©ã«ãå€ã䜿ãããã®ã§æåããŸããã€ãŸããããã©ã«ãå€ã®ç¡ããã®ã¯å¿
é ãã£ãŒã«ããšæ±ãããããã§ãã
ä»åºŠã¯ idã¯ããããã©ããæŽæ°ã§ã¯ãªãæååãªããŒã¿ã䜿ã£ãŠã¿ãŸãã
>>> userdata = {
... "id": "abc",
... "name": "Taro Yamada",
... }
>>> user = User(**userdata)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for User
id
value is not a valid integer (type=type_error.integer)
ãidã¯æŽæ°ããç¡ããšãã¡ã ãããšãããšã©ãŒã«ãªããŸãã
ãªã "id": "123"ãšãããšæååã ã£ããšããŠãããªããŒã·ã§ã³ãéããŸããåæã«ïŒèŠªåã«ïŒæååããæŽæ°ãžã®å€æãè¡ãªã£ãŠãããã§ãã¯ããŠãããŠããã®ã§ãããããå³å¯ã«æŽæ°ã®ã¿ãåãä»ããããšããããšã§ããã°ãintã®ä»£ããã«pydantic.StrictIntã䜿ããšã§ããŸãã
æ°ããŒãžã§ã³V2
V2ãŸã§ã®éã®ã
ããããããããæ¬é¡ã§ããããŸãã¯ã¹ã±ãžã¥ãŒã«äºå®ã§ããV2ãåºããŸã§ã«ã©ãããã¹ããããèžãã®ããRoadmapãšãã圢ã§èšèŒãããŠããŸãããªããç§ãèŠãŠããããã¥ã¡ã³ãã¯ã¯2022幎7æ10æ¥ã«ã¢ããããŒãããããã®ãªã®ã§ããããæžãããæç¹ããæ¢ã«é²ãã§ããéšåããããŸãã
- pydantic-core (åŸè¿°) ã«ããå°ãæ©èœè¿œå ããŠæåã®ããŒãžã§ã³ããªãªãŒã¹ãã
- ããã¯æ¢ã« https://github.com/samuelcolvin/pydantic-core ã§ 0.1.0ã2022幎8æ3æ¥ã«åºãŠããŸãïŒ
- V1.10åãã®ããŒãžäœæ¥ããã
- V1.10ãåºã
- V1.10ã«å ¥ããªãã£ãå€ããªã£ãŠããŸã£ãPRã«ããããªãããã
- è¯ãæ©äŒãªã®ã§ã
masterãmainã«åç§°å€æŽãã -
mainãV2åããšãã - PydanticãV2åãã«å€æŽãå§ããæ¢åã®ãã¹ããã©ããããéãããèŠã
- ãã¹ããéãããã«ããŠããŸã倿ŽããŠããç¹°ãè¿ã
- V2ããªãªãŒã¹ããïŒ
ãããã10ææ«ãŸã§ã«ãé ããšã幎æ«ãŸã§ã«ã¯ããåãïŒãšèšã£ãŠãŸããããžãããã£ã¬ã³ãžã£ãŒã ãªãã
Pydantic-core
å€ãã®éçºè ã®è²¢ç®ããã£ãŠPydanticã¯æ§ã ãªãšããã§å©çšãããããã«ãªããŸããããäžå¿ã®ããžãã¯ã¯æåã®ãªãªãŒã¹ããã»ãŒå€ãã£ãŠããŸãããããã§ãV2ã¯äœãçŽãã®è¯ãæ©äŒãšèããŠãã³ã¢éšåã pydantic-core ãšããŠåãåºãããšã«ããŸãããPydantic-coreã¯ããæ°ã¶æããããŠäœã£ãŠãããã®ã§ Rustã§æžãããŠããŸããããã PyO3ãšããã©ã€ãã©ãªã䜿ã£ãŠPythonããåŒã¹ãããã«ããŠããŸããRustã䜿ã£ãçç±ã¯ä»¥äžã®3ã€ã§ãã
- æ§èœ
- ã³ãŒãã®å¯èŠæ§ãšæ¡åŒµæ§
- 颿°åŒã³åºããéãã®ã§ãã³ã¢ã®ããžãã¯ãå°ããªããªããŒã¿ãŒãäºãã«åŒã³åºã圢ã§å®è£ ã§ãã
- å®å
šæ§
- pydantic-coreã¯è€éãªã³ãŒãã§å€ãã®çš®é¡ã®ãšã©ãŒãåºå¥ããå¿ èŠããããRustã¯ããããã®åŸæãªã®ã§ãã°å°ãªãå®è£ ã§ããïŒãšæãïŒ
V2ã§å€§ããå€ãããšãã
æ§èœ
ããã«ãã³ãããŒã¯çµæããããŸãããV2ã¯Rustã§å®è£ ãçŽããããšã«ãã£ãŠV1ãšæ¯ã¹ãŠ4åãã50åéããªã£ãŠããŠãéåžžãçŽ17åéããªã£ãŠãããšã®ããšã
Strict Mode
äžã®äŸã§ãæååã®"123"ãæŽæ°ã®123ã«èªåã§å€æãããŠããªããŒã·ã§ã³ãéã£ãŠããŸãããšã説æããŸããããããé¿ããããã«ã¯ç¹å¥ãªåãæå®ããªããã°ãªããªãã£ãã®ã§ãããV2ã§ã¯ "strict mode"ïŒå³å¯ã¢ãŒãïŒã远å ãããŠãã¢ãã«ããã£ãŒã«ãããšã«æå®åºæ¥ãããã«ãªããŸãã
ããŒã¿å€æã«ãŒã«ã®æç¢ºå
å³å¯ã¢ãŒãã§ã¯ãªãæã«ã¯ããŒã¿ã¯èªå倿ãããŸããããã®æã®æåãæç¢ºåãããŸããäŸãã°ãããŒã¿ãæ¬ èœããå Žåã¯ãšã©ãŒã«ãªããŸããäŸãã°ã123.1 ã intã§åãããã2020-01-01T12:00:00ãdateåã§åããããšããå Žåã
JSONãµããŒããå å
V2ã§ã¯JSONãããŒã¹ããŠãã®ãŸãŸã¢ãã«ã察象ã®åã«å€æããŠãããŸããïŒãããŸã§ã¯äžæŠJSONã®ããŒã¹ãããŠdictåã®ããŒã¿ãäœã£ãŠããããã¢ãã«ã察象ã®åã«å€æããŠè¡ã£ãã®ããªïŒ
ã¢ãã«ãªãã®ããªããŒã·ã§ã³
V1ã§ã¯ããªããŒã·ã§ã³ãè¡ãããã«ã¯ã¢ãã«ãå¿ èŠã§ããã®ããã«ç¡é§ã«ã¢ãã«äœã£ããæ§èœé¢ã§ãããã«ãã£ããããŸãããV2ã§ã¯ãåç¬ã®æååãDatetimeåãTypedDictåãããŒã¿ã¯ã©ã¹åãURLãªã©ãçŽæ¥ããªããŒã·ã§ã³ã§ããããã«ãªããŸãã
ãå¿ é ããšãNullå¯ãã®ã¯ãªãŒã³ã¢ãã
V1ã§ã¯ãã£ãŒã«ãã®å€ãå¿
é ã§ããããšãšNullãå
¥ããããããšãæ··åãããã¡ã§ãããV2ã§ã¯ãããæç¢ºã«ããŸããNullå¯ã§ããããšã¯ãåå®çŸ©ã§ | Noneã远å ããããšã§è¡šããå¿
é ã§ãããã©ããã¯ããã©ã«ãå€ãèšå®ãããã©ããã§è¡šããŸãã
from pydantic import BaseModel
class Foo(BaseModel):
f1: str # å¿
é ã§Nullã«ããããšã¯ã§ããªã
f2: str | None # å¿
é ã ãã©Nullãæå®ããããšã¯å¯èœ
f3: str | None = None # å¿
é ã§ã¯ãªããNullãæå®ããããšãå¯èœ
f4: str = 'Foobar' # å¿
é ã§ã¯ãªãããNullã«ã¯åºæ¥ãªã
ããªããŒã¿ãŒé¢æ°ã®æ¹å
V1ã§ã¯ããªããŒã¿ãŒé¢æ°ã¯é çªã«é©çšããã圢ã§ããããV2ã§ã¯å
¥ãåæ§é ã§åŒã¹ãããã«ãªããŸãããããŸã§ã¯ãpre=Trueãªã©ãé§äœ¿ããŠé åºã®ã³ã³ãããŒã«ãããŠããŸããããV2ããã¯æ¡ä»¶ã«ãã£ãŠã¯äžèŠãªããªããŒã¿ã®åŒã³åºããã¹ãããã§ãããããã®ã§ããå¹ççã«ããªããŒã·ã§ã³ãè¡ããŸãããŸããå
¥ãåã®ããªããŒã¿ãããªããŒã·ã§ã³ãšã©ãŒã«ãªã£ãæã«ããããã£ããããŠããã©ã«ãå€ãè¿ããšããããšãåºæ¥ãããã«ãªããŸãã
ãããã¯ãã«ãªãšã€ãªã¢ã¹
ïŒããããäŸãæç€ºãããŠããã®ã§ããããŸã å®è¡ç°å¢ããªããŠããçè§£ã§ããŠããŸããããããããbazã®index=2ã®èŠçŽ ã®quxã®å€ãbarã®å€ã«ããããšããããšãåºæ¥ãã®ã ãããšæ³åããŠããŸãïŒ
from pydantic import BaseModel, Field
class Foo(BaseModel):
bar: str = Field(aliases=[['baz', 2, 'qux']])
data = {
'baz': [
{'qux': 'a'},
{'qux': 'b'},
{'qux': 'c'},
{'qux': 'd'},
]
}
foo = Foo(**data)
assert foo.bar == 'c'
ãã³ããã·ãªã¢ã©ã€ãºããšã¯ã¹ããŒãã®æ¹å
V2ããã¯model.dict()ã§JSONæºæ ã®åã®ã¿ã䜿ããšãã¹ããŒããåºæ¥ãããã«ãªããŸããV1ã§ã¯äŸãã° datetime åã¯ãã®ãŸãŸæžãåºãããŠããŠãjson.dumps()ãããšãšã©ãŒã«ãªã£ã¡ãããŸãïŒçŽæ¥model.json()ããã°å€§äžå€« ïŒã
ããªããŒã·ã§ã³ã®ã³ã³ããã¹ã
model_validateãmodel_validate_jsonã§ã³ã³ããã¹ãæ
å ±ãåŒæ°ã§æž¡ããããã«ãªããŸããã³ã³ããã¹ãã¯èŸæžåã®ããŒã¿ã§ä»»æã®ããŒã§æ
å ±ãåŒãæž¡ãã§ããŸãã
以äžã®äŸã§ã¯ããµããŒãããŠããåœã³ãŒãã®æ
å ±ãDBããååŸããŠãããæž¡ããŠããŸãããããŠããªããŒã¿åŽã§ããã䜿ã£ãŠ home_countryãã£ãŒã«ãã®åœã³ãŒãããã®äžã«å«ãŸããŠãããã©ããã®ãã§ãã¯ãããŠããŸãã
from pydantic import BaseModel, EmailStr, validator
class User(BaseModel):
email: EmailStr
home_country: str
@validator('home_country')
def check_home_country(cls, v, context):
if v not in context['countries']:
raise ValueError('invalid country choice')
return v
async def add_user(post_data: bytes):
countries = set(await db_connection.fetch_all('select code from country'))
user = User.model_validate_json(post_data, context={'countries': countries})
...
ã¢ãã«åå空éã®ã¯ãªãŒã³ã¢ãã
Pydanticã§äœãã¢ãã«ã¯ pydantic.BaseModelãç¶æ¿ããŠããŸãããã®ãããããã§å®çŸ©ãããŠããã¡ãœããåãšåããã£ãŒã«ãåãæã€ã¢ãã«ã¯äœããŸããã§ãããV2ã§ã¯ããã model_ã§å§ãŸãã¡ãœããåã«çµ±äžããŠè§£ããããããŸããå
·äœçã«ã¯ä»¥äžã®ããã«ãªããŸã
-
.model_validate()ïŒå .parse_obj()ïŒ -
.model_validate_json()ïŒå .parse_raw(..., content_type='application/json')ïŒ -
.model_is_instance()ïŒæ°èšïŒ -
.model_is_instance_json()ïŒæ°èšïŒ -
.model_dump()ïŒå .dict()ïŒ -
.model_dump_json()ïŒå .json()ïŒ -
.model_json_schema()ïŒå .schema()ïŒ -
.model_update_forward_refs()ïŒå .update_forward_refs()ïŒ -
.model_construct()ïŒå .construct()ïŒ -
.model_customize_schema()ïŒæ°èšïŒ -
ModelConfigïŒå ConfigïŒ
ãããŠã以äžã¯åé€ãããŸã
-
.parse_file()- Pydanticã«å ¥ããã®ééãã§ãã -
.parse_raw()- Jsonãèªãã®ã¯.model_validate_json()ãžããã以å€ã¯ééãã§ãã -
.from_orm()- configã«ç§»å -
.schema_json()-json.dumps(m.model_json_schema())ã§çœ®ãæã -
.copy()-__copy__ãå®è£ ããŠcopyã¢ãžã¥ãŒã«ãã€ãã£ãŠãããããšã«ããŸãã
Strict APIãšAPIããã¥ã¡ã³ããŒã·ã§ã³
V2ã§ã¯å
¬éAPIãšå
éšé¢æ°ãã¯ã©ã¹ãæç¢ºã«åãåããŸããå
éšã®ãªããžã§ã¯ã㯠_internalãµãããã±ãŒãžã«å
¥ããŠå©çšãã«ããããŠããŸããå
¬éAPIã«ã¯ããã¥ã¡ã³ããäœãããŸããmkdocstringsã䜿ãäºå®ã§ãã
ãšã©ãŒèšè¿°
V2ã§ã¯ããæŽç·Žããããšã©ãŒè¡šç€ºããããããã«ãªããŸãããã®äžã«ã¯ãã®ã¿ã€ãã®ãšã©ãŒã®è©³çްãèšè¿°ããWebããŒãžãžã®URLãå«ãŸããŠããŠã©ããªãšã©ãŒãèµ·ããŠããã®ããçè§£ãããããªã£ãŠããŸãã
Pure Python
pydantic-coreã¯Rustã§æžãããã®ã§ãã€ããªããã±ãŒãžãã€ã³ã¹ããŒã«ã§ããç¹å®ã®ç°å¢ã®ã¿ã§åäœããŸãããµããŒãäºå®ã®ç°å¢ã¯ä»¥äžã®éãã§ãã
-
Linux:
x86_64,aarch64,i686,armv7l,musl-x86_64,musl-aarch64 -
MacOS:
x86_64,arm64(python 3.7ãé€ã) -
Windows:
amd64,win32 -
Web Assembly:
wasm32ïŒwasmäžã®Pythonã¯åé¡ããã¿ããã ãã©ãpydantic-coreã¯wasm32ã§ã³ã³ãã€ã«ããŠãŠããããã¹ãéããŸãïŒ
äžæ¹ãPydanticãã®ãã®ã¯Pure Pythonã«ãªããŸããV1ã§ã¯æ§èœæ¹åã®ããã«cythonã䜿ã£ãŠå©çšç°å¢åãã«ã³ã³ãã€ã«ããŠããŸããããV2ã§ã¯ãã®ãããªããŒã㯠pydantic-coreã«å¯ããããŠããŸããããã«ãã£ãŠpydanticã®ã³ãŒããµã€ãºã¯å°ãããªãããŠããããã¹ããéããªããŸããã
is_instanceçãªãã§ãã¯
.model_is_instance()ã¡ãœããã«ãã£ãŠãäŸå€åŠçã䜿ããã«ãã®ããŒã¿ã察象ã®ã¢ãã«ã«å€æå¯èœãã True/Falseã§ç¥ãããšãåºæ¥ãããã«ãªããŸãã
Parseã£ãŠäœ¿ãã®ããããã
V1ã§ã¯"parse"ãšããèšèãš"validate"ãšããèšèãã¡ãœããåãªã©ã§æ··åšããŠäœ¿ã£ãŠããŸãããPydanticã¯ããªããŒã·ã§ã³ã ãã®ã©ã€ãã©ãªã§ã¯ãªãã§ãããã»ãšãã©ã®äººã¯ "validate"ã䜿ãã®ã§ãã¡ãã§çµ±äžããããšã«ããŸããã
ã«ã¹ã¿ã ãã£ãŒã«ãåã®å€æŽ
ããªããŒã¿ãŒã®åŒã³åºãæ¹ã倿Žããã®ã§ãV1ã® __get_validators__ã䜿ã£ãã«ã¹ã¿ã ãã£ãŒã«ãåã®å®çŸ©æ¹æ³ã¯äœ¿ããªããªã£ãŠããŸããŸããã代ããã«ã__pydantic_validation_schema__ãšãã屿§ãèŠãããã«ããŠãããã« pydantic-coreäºæã®ã¹ããŒããæžãã°ãããé©çšãã圢ã«ããŸããã
ãã®ä»å€æŽ
- å·¡ååç §ã«ããååž°ã¢ãã«ãå®çŸ©ã§ããŸããV1ã§ãåºæ¥ãŸããããPythonã®ååž°åŒã³åºãäžéïŒ1000ïŒã«åŒã£ãããã§ãšã©ãŒãåºãŠããŸãããšããããŸãããV2ã§ã¯Rustã§å®è£ ãããŠããŠæ£ããåŠçã§ããŸãã
- pydantic-coreãwasmã§ã³ã³ãã€ã«ããŠåããããšã«ãã ãã£ãŠããã®ã¯ãPydantic V2ã®ã³ãŒãäŸããã©ãŠã¶ã®äžã§ç·šéããŠå®è¡åºæ¥ãããã«ããããã§ãã
-
total=Falseã®å Žåãå«ããŠTypedDictããµããŒãããŸããã -
from_ormã¯from_attributesãšãªããã¹ããŒãçææã«å®çŸ©ãããããšã«ãªããŸãïŒã¢ãã«ã®Configããã£ãŒã«ãã®Configã«ãŠïŒ -
input_valueãValidationErrorã«è¿œå ãããŠãªããšã©ãŒãèµ·ããã®ãããããããããªããŸãã - ã¹ããŒãã§
on_errorããžãã¯ãå®çŸ©ã§ããŠããšã©ãŒã®æã«ããã©ã«ãå€ãã»ããããã®ãããã®å€ãç¡ãããšã«ããã®ããéžã¹ãããã«ãªããŸããã -
datetime,date,time,timedeltaã®ããªããŒã·ã§ã³ãæ¹åããŸããããã®ããã«speedateãšããRustã®ã©ã€ãã©ãªãæ°ãã«äœããŸããã - å ¥ãåã«ãªã£ãã¹ããŒãã®èšå®ãããŒãžãããã¯äžæžãããããã«ãåªå 床ãã®ä»çµã¿ãã§ããŸããã
-
annotated-typesã®ãµããŒããè¡ãã®ã§ã
Annotated[set[int], Len(0, 10)]ïŒæŽæ°ã®ã»ããåããã ãèŠçŽ æ°ã¯0ãã9ãŸã§ïŒãšããAnnotated[str, Len(1, 1024)]ïŒæååããã ãæåæ°ã¯1ãã1023ãŸã§ïŒãšããåãããªããŒã·ã§ã³ã§ããŸã - äžçš®é¡ã®
validateãšãããã³ã¬ãŒã¿ãè²ã ãªå Žæã§äœ¿ããŸãã- 颿° (
validate_argumentsã®çœ®ãæã) - ããŒã¿ã¯ã©ã¹ã
pydantic.dataclasses.dataclassã¯ããã®ãšã€ãªã¢ã¹ã«ãªã TypedDict- ãµããŒãããŠããå
šãŠã®åãäŸãã°ã
Union[...],Dict[str, Thing]ãªã© - ã«ã¹ã¿ã ãã£ãŒã«ãåã
__pydantic_schema__屿§ãæã€ãã¹ãŠã®ãã®
- 颿° (
- ããªããŒã·ã§ã³ãšã©ãŒãç°¡åã«äœæããæ¹æ³ãæäŸããŸããç¹ã«ã¢ãã«ã®å€ã§åºæ¥ãæ¹æ³ã欲ããïŒã©ããããã¯ãŸã 決ãŸã£ãŠããªãïŒïŒ
- ã¢ãã«ã®
__eq__ã®æ§èœæ¹å - èšç®ããããã£ãŒã«ããã¢ã€ãã£ã¢ã¯ãã£ãšãã£ãŠãã¡ãããšãããã®ãäœãã¹ã
- ãµãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãããŒã¿ãæŒãããã«ã¢ãã«ãããªããŒã·ã§ã³ããæ¹æ³ãæäŸããŸãïŒããããããªã??ïŒ
- ããŒãžã§ã³ã¯semvarã®ã«ãŒã«ã«åŸããŸã
- ãžã§ããªãã¯ã¹åã§
M(GenericModel, Generic[T])ãšæžããªããã°ãªããªãã£ãã®ããGenericModelã¯å»æ¢ããŠM(BaseModel, Generic[T])ãšæžããããã«ããŸãã
åé€ãããæ©èœãšå¶é
- ã¢ãã«ãªãã§ããªããŒã·ã§ã³ã§ããããã«ãªãã®ã§
__root__ã«ã¹ã¿ã ã«ãŒãã¢ãã«ã¯äžèŠã«ãªããŸãã -
.parse_file()ã¯åé€ãããŸãã.parse_raw()ã®äžéšæ©èœïŒjsonããªããŒã·ã§ã³ïŒã¯.model_validate_json()ã«åŒãç¶ããããã以å€ã¯åé€ãããŸãã -
.schema_json()ãš.copy() -
TypeErrorã¯ããªããŒã·ã§ã³ãšã©ãŒãšããŠæ±ãããªããªããŸããã颿°ããªããŒã¿ãŒã§åŒæ°åã®ãšã©ãŒããã£ããããã®ã«å éšã§äœ¿ãããŸãã - çµã¿èŸŒã¿åã®
str,bytes,intã®ãµãã¯ã©ã¹ã¯ãªããªããŸããããããã®ããªããŒã·ã§ã³ãRustã§æžãã pydantic-coreã§ããããã§ãããå¿ èŠã§ããã° wrap ããªããŒã¿ãŒãã«ã¹ã¿ã ã¿ã€ãããªããŒã¿ãŒã䜿ãããšãã§ããŸã - æŽæ°ã¯Rustã®i64ã§è¡šçŸãããããšã«ãªããŸãããããè¶ ããæ°å€ãæ±ããããã° wrapããªããŒã¿ãŒãæžãããšã§å®çŸã§ããŸãã
-
èšå®ç®¡çãæ©èœããªããã€ããã¯ãªããã©ãPydanticãšã¯å¥ã®ããã±ãŒãžã«ããããPydanticã®extraã«ããŠã
pip install pydantic[settings]ã§ã€ã³ã¹ããŒã«ã§ããããã«ãããšãïŒãŸã 決ãŸã£ãŠããªãæš¡æ§ïŒ - 以äžã®Configã®ããããã£ã¯åé€ãããŸã
-
fields-Fieldãåºæ¥ãåãããã£ããã®ã§ãåé€å¯èœã§ãã -
allow_mutation-frozenã§ä»£çš -
error_msg_templates- ã¡ãããšããã¥ã¡ã³ãåãããŠãããããšã©ãŒã¡ãã»ãŒãžã¯å€éšããžãã¯ã§ã«ã¹ã¿ãã€ãºå¯èœ -
getter_dict- pydantic-core ã¯ããŒãã³ãŒããããfrom_attributesããžãã¯ãæã£ãŠãã -
json_loads- ãããpydantic-coreã§ããŒãã³ãŒããããŠãã -
json_dumps- å€åæ¶ã -
json_encoders- äžã®ã¢ãŒãã®è°è«ãåç §ããŠãã ãã -
underscore_attrs_are_private- ããã©ã«ãå€ã§PrivateAttrã€ããã°è¯ãã ã -
smart_union- å šãŠã®unions㯠"smart"ã«ãªããŸãã
-
ãŸãšã
Pydantic V2ã«ã€ããŠãŸãšããŠã¿ãŸãããéäºæã®å€æŽãå ããã®ã§ãããŸã§ã®ã³ãŒãã®æžãæããäžå®å¿ èŠã«ãªãããã§ãããããã ãé床åäžããããšãããååãã«ã§ãããã§ãããããŠãé床ã ãã§ãªãè²ã ãšã¯ãªãŒã³ããããããŠããã®ã§å šäœçã«ã¹ãããªæžããããã«ãªãã®ã§ã¯ãªãããšæåŸ ããŠããŸãã
ãªãããããŸã§Pythonã§ããã©ãŒãã³ã¹ãäžããããã®ææ®µãšã㊠SWIG, Pyrex, Cythonãªã©ãææ¡ãããŠããŸããããPydantic V2ã§ã¯Rustã䜿ã£ãŠé床åäžãããšããæ°ããææ®µãåã£ãŠããŠããããå¯èœã«ããŠãã PyO3ãšããã©ã€ãã©ãªã«ãã¡ãã£ãšèå³ãããã®ã§ãæéãèŠã€ããŠãã¡ããèŠãŠã¿ãããšæããŸãã