コンテンツにスキップ

Pydantic を使ってシーケンスを名前でアクセスする

背景

次のようなコードだとシーケンスの要素にアクセスする際に、インデックスを使う必要がある。

1
2
3
4
5
6
7
8
# x , y or y, x
coordinate = (1, 2)

# left, right, top, bottom?
rectangle = (1, 2, 3, 4)

# width, height?
size = (1, 2)

上記のようなコードだと、各要素が何を示しているかわかりにくい。そこで、Pydantic を使って名前でアクセスできるようにする。

シーケンスを名前でアクセスする

下記のように、AliasPath を使って名前でアクセスできるようにする。namesでリストを受け取り、その要素をfirst_namelast_nameに割り当てる。

from pydantic import BaseModel, Field, AliasPath


class User(BaseModel):
    first_name: str = Field(validation_alias=AliasPath('names', 0))
    last_name: str = Field(validation_alias=AliasPath('names', 1))

user = User.model_validate({'names': ['John', 'Doe']})
print(user)
#> first_name='John' last_name='Doe'

AliasPath は、AliasChoices と組み合わせて使うことで、明確な field 名とシーケンスの両方で値を受け取ることができる。

from pydantic import BaseModel, Field, AliasPath, AliasChoices


class User(BaseModel):
    first_name: str = Field(validation_alias=AliasChoices('first_name', AliasPath('names', 0)))
    last_name: str = Field(validation_alias=AliasChoices('last_name', AliasPath('names', 1)))


user = User.model_validate({'first_name': 'John', 'last_name': 'Doe'})
print(user)
#> first_name='John' last_name='Doe'
user = User.model_validate({'names': ['John', 'Doe']})
print(user)
#> first_name='John' last_name='Doe'
user = User.model_validate({'names': ['John'], 'last_name': 'Doe'})
print(user)
#> first_name='John' last_name='Doe'