コンテンツにスキップ

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

背景

配列やタプルの要素へ番号ではなく名前でアクセスできるよう、Pydantic のAliasPathを使う。入力配列の各位置をモデルのフィールドに割り当てる例を示す。

次のコードでは、シーケンスの要素へアクセスする際にインデックスが必要になる。

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_nameとlast_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を組み合わせる。

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'