このツールの動作
JSON の標本が Python のクラスになります。オブジェクト一つにつき一つです。
{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
from pydantic import BaseModel, Field
class Address(BaseModel):
city: str
class Root(BaseModel):
id: int
first_name: str = Field(alias="firstName")
address: Address
子が先に宣言されます。あるクラスが別のクラスで項目に注釈を付ける前に、そのクラスが存在している必要があるからです。出力は現代の Python を想定しています。list[str] や int | str をそのまま書くので、3.10 以降が要ります。
三つの書き方、三つの代償
| 書き方 | 得られるもの | 代償 |
|---|---|---|
| Pydantic | 境界での検証、名前を変えた鍵の別名 | 依存が一つ増え、素のオブジェクトではなくなる |
| dataclass | 単純な入れ物、標準ライブラリだけ | 検証なし、名前を変えた鍵の別名もなし |
| TypedDict | すでにある辞書への注釈 | 実行時には何も起きない——つまり検査もされない |
構造は三つとも同じです。変わるのは、その型があなたのためにどこまでやるかです。
予約語でファイルが壊れることはもうない
{"class": 1} は以前こう出ていました。
class Root(BaseModel):
class: int
これは Python ではありません。ファイルは解析すらされません。予約語には下線が付き、Pydantic の別名が鍵を保ちます。
class_: int = Field(alias="class")
本物の欠陥で、この文章を書く過程で見つけ、直しました。TypedDict の逃げ方は別です。属性名にできない鍵があると、定義全体が関数形式 Root = TypedDict('Root', {"class": int}) に切り替わります。そこでは鍵は文字列であり、何でも書けます。
標本があなたに言えないこと
| None は付かず、既定値も付きません。どの項目も必須です。標本がそれを持っていたからです。null は型 None になり、ほかを一切受け付けません。「文字列、ときどき null」なら str | None に直してください。無いこともあるなら = None も添えます。
同じ snake_case になる二つの鍵——fooBar と foo_bar——は、混ぜずに番号付きの接尾辞で分けます。どちらがどちらだったかは別名が記録します。
プライバシー
すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。