Pydantic は mypy で細かい設定なしに上手く動作します。
しかし Pydantic には mypy プラグインも付属しており、コードの型チェック機能を向上させるために多くの重要な Pydantic 固有の機能を追加しています。
例えば、次のスクリプトを考えてみましょう:
{!.tmp_examples/mypy_main.py!}
特別な設定をしなくても、mypy はエラーを一つキャッチします(使用方法についてはこちらを参照してください):
13: error: "Model" has no attribute "middle_name"
しかしプラグインを有効にすると、全てキャッチします:
13: error: "Model" has no attribute "middle_name"
16: error: Missing named argument "age" for "Model"
16: error: Missing named argument "list_of_ints" for "Model"
Pydantic の mypy プラグインを使えば、フィールド名や型が変わっても mypy がミスをキャッチしてくれることを知っているので、 恐れること無くモデルをリファクタリングできます。
他にも利益があります! 以下の詳細を見てください。
- 動的に決定されたエイリアスを持たない必須フィールドは、必須キーワード引数として含まれます。
Config.allow_population_by_field_name = True
の場合、生成されたシグネチャはエイリアスではなくフィールド名を使用します。
BaseSettings
のサブクラスでは、環境から読み込まれる可能性があるため、 すべてのフィールドはオプションとして扱われます。
config.extra="forbid"
で、動的に決定されたエイリアスを使用しない場合、生成されたシグネチャは予期しない入力を許可しません。
- オプション:
init_forbid_extra
プラグインの設定がTrue
に設定されている場合、Config.extra
が"forbid"
でなくても、__init__
への予期しない入力はエラーを発生させます。
- オプション:
init_typed
プラグインの設定がTrue
に設定されている場合、 生成されたシグネチャはモデルフィールドの型を使用します(そうでない場合は、解析を可能にするためにAny
としてアノテーションされます)。
- 入力データが有効であることがわかっていて解析する必要がない場合、
construct
メソッドは__init__
のより高速な代替手段です。 ただし、このメソッドは実行時の検証を実行しないため、エラーを検出するには静的チェックが重要です。
Config.allow_mutation
がFalse
の場合、モデルフィールドの値を変更しようとすると mypy エラーが発生します。 (例. イミュータブルな偽)
Config.orm_mode
がFalse
の場合、.from_orm()
をコールしようとすると mypy エラーが発生します。 (例. ORM モード)
@pydantic.dataclasess.dataclass
でデコレータされたクラスは標準の Python データクラスと同じように型チェックされます。
@pydantic.dataclasess.dataclass
デコレータはConfig
サブクラスと同じ意味を持つconfig
キーワード引数を受け入れます。
<<<<<<< HEAD
warn_required_dynamic_aliases
プラグイン設定 がTrue
に設定されている場合、Config.allow_population_by_field_name=False
のモデルで動的に決定されたエイリアスまたはエイリアスジェネレータを使用すると mypy エラーが発生します。
- このようなエイリアスが存在する場合、
__init__
のコールを適切に型チェックできないため、これは重要です。 この場合、すべての引数をオプションとして扱うことがデフォルトになります。
warn_untyped_fields
プラグイン設定 がTrue
に設定されている場合、 モデルに型をアノテーションせずにフィールドを作成すると mypy エラーが発生します。
- アノテーションされていないフィールドではバリデータが意外な順序で適用される可能性があるため、これは重要です。
- さらに、mypyはフィールドのタイプを正しく推測できない可能性があり、 チェックし損ねたり、誤ったエラーを発生させたりする可能性があります。
プラグインを有効にするには、mypy 構成ファイル
(これは mypy.ini
または setup.cfg
になります)のプラグインリストに pydantic.mypy
を追加するだけです。
開始するには、次の内容の mypy.ini
ファイルを作成するだけです。
[mypy]
plugins = pydantic.mypy
より詳細な情報は mypy の使い方 と プラグイン構成 を見てください。
さらに強力なチェックが必要な場合、プラグインはいくつかのオプションの厳密なフラグを提供します。
init_forbid_extra
有効にすると、Config.extra
が "forbid"
でない場合でも __init__
呼び出しへの追加の引数を許可しません。
init_typed
有効にすると、__init__
メソッド用に生成されたシグネチャに型ヒントとしてフィールドの型を含めます。
これは、たとえ安全に型をパースできたとしても正しい型でない引数を __init__
に渡すと mypy のエラーが発生することを意味します。
warn_required_dynamic_aliases
有効にすると、モデルが作成されたときに __init__
または construct
メソッドの呼び出しで静的に決定できないエイリアスの使用を必要とする場合に、mypy エラーが発生します。
これは例えば、allow_population_by_field_name=False
で、モデルがエイリアスジェネレーターを使用している場合に起こります。
warn_untyped_fields
有効にすると、モデル上で型を明示的に指定せずにフィールドを宣言する場合に mypy エラーが発生します。
プラグイン設定の値を変更するには mypy 設定ファイルに [pydantic-mypy]
というセクションを作成し、
オーバーライドしたい設定のキーと値のペアを追加します。
全てのプラグインの厳密フラグ(および他のいくつかの mypy 厳密フラグ)を有効にした mypy.ini
ファイルは次のようになります:
[mypy]
plugins = pydantic.mypy
follow_imports = silent
warn_redundant_casts = True
warn_unused_ignores = True
disallow_any_generics = True
check_untyped_defs = True
no_implicit_reexport = True
# for strict mypy: (this is the tricky one :-))
disallow_untyped_defs = True
[pydantic-mypy]
init_forbid_extra = True
init_typed = True
warn_required_dynamic_aliases = True
warn_untyped_fields = True