PythonでのOptionalおよびNullable JSONフィールドの処理
nullまたは不在の可能性があるJSONフィールドをPythonのOptional型に変換する方法を学びます。Optional[T]、T | None構文、デフォルト値を解説します。
Type Annotations
詳細な説明
PythonでのOptionalフィールド
JSONフィールドは null であったり、完全に不在であったりする場合があります。Pythonではこれを Optional[T](typing モジュールから)または新しい T | None 構文(Python 3.10+)で表現します。
JSONの例
{
"id": 1,
"name": "Alice",
"bio": null,
"avatar_url": null,
"phone": "555-1234"
}
生成されるPython
from dataclasses import dataclass
from typing import Optional
@dataclass
class User:
id: int
name: str
bio: Optional[str]
avatar_url: Optional[str]
phone: Optional[str]
Optional vs Required
- 必須フィールド — 常に存在し、決して
nullにならない。型:str、int等。 - Nullableフィールド — 存在するが
nullの可能性がある。型:Optional[str](str | Noneと同義)。 - オプショナルフィールド — 完全に不在の可能性がある。型:
Optional[str]でデフォルト値None。
Python 3.10+の構文
@dataclass
class User:
id: int
name: str
bio: str | None = None
avatar_url: str | None = None
phone: str | None = None
X | None 構文はより簡潔で、モダンなPythonでの推奨スタイルです。
実行時のNone処理
if user.bio is not None:
print(user.bio.upper()) # 安全 — mypyはbioがstrであることを認識
else:
print("No bio provided")
mypyなどの型チェッカーは if ブランチ内で型を絞り込み、None での AttributeError を防ぎます。
複数のJSONサンプル
コンバーターが複数のJSONサンプルを分析し、あるフィールドが存在したりしなかったりする場合、そのフィールドをデフォルト付きの Optional としてマークします:
@dataclass
class User:
id: int
name: str
bio: Optional[str] = None # 一部のサンプルで不在
ベストプラクティス
Noneが有効な値である場合にのみOptionalを使用する — 「念のため」ですべてをoptionalにしないこと。- JSONペイロードからフィールドが不在の可能性がある場合、デフォルト値
Noneを提供する。 - 厳格なmypy設定(
--strict)を使用して、処理されていないNone値を検出する。
ユースケース
APIがユーザープロファイルを返し、bio、avatar、電話番号などのフィールドがユーザーの入力状況に応じてnullになる可能性があり、mypyで未処理のNoneアクセスを検出する必要がある場合に使用します。