Skip to content

Latest commit

 

History

History
315 lines (262 loc) · 13.6 KB

mypy_plugin.md

File metadata and controls

315 lines (262 loc) · 13.6 KB

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 がミスをキャッチしてくれることを知っているので、 恐れること無くモデルをリファクタリングできます。

他にも利益があります! 以下の詳細を見てください。

プラグイン機能

Model.__init__ のシグネチャを生成

  • 動的に決定されたエイリアスを持たない必須フィールドは、必須キーワード引数として含まれます。
  • Config.allow_population_by_field_name = True の場合、生成されたシグネチャはエイリアスではなくフィールド名を使用します。
  • BaseSettings のサブクラスでは、環境から読み込まれる可能性があるため、 すべてのフィールドはオプションとして扱われます。
  • config.extra="forbid" で、動的に決定されたエイリアスを使用しない場合、生成されたシグネチャは予期しない入力を許可しません。
  • オプション: init_forbid_extra プラグインの設定True に設定されている場合、 Config.extra"forbid" でなくても、__init__ への予期しない入力はエラーを発生させます。
  • オプション: init_typed プラグインの設定True に設定されている場合、 生成されたシグネチャはモデルフィールドの型を使用します(そうでない場合は、解析を可能にするために Any としてアノテーションされます)。

Model.construct の型付けされたシグネチャを生成

  • 入力データが有効であることがわかっていて解析する必要がない場合、construct メソッドは __init__ のより高速な代替手段です。 ただし、このメソッドは実行時の検証を実行しないため、エラーを検出するには静的チェックが重要です。

Config.allow_mutation を尊重

  • Config.allow_mutationFalse の場合、モデルフィールドの値を変更しようとすると mypy エラーが発生します。 (例. イミュータブルな偽)

Config.orm_mode を尊重

  • Config.orm_modeFalse の場合、.from_orm() をコールしようとすると mypy エラーが発生します。 (例. ORM モード)

dataclasses のシグネチャを生成

  • @pydantic.dataclasess.dataclass でデコレータされたクラスは標準の Python データクラスと同じように型チェックされます。
  • @pydantic.dataclasess.dataclass デコレータは Config サブクラスと同じ意味を持つ config キーワード引数を受け入れます。

<<<<<<< HEAD

オプション機能

必須の動的エイリアスの使用を防止

  • warn_required_dynamic_aliases プラグイン設定True に設定されている場合、 Config.allow_population_by_field_name=False のモデルで動的に決定されたエイリアスまたはエイリアスジェネレータを使用すると mypy エラーが発生します。
  • このようなエイリアスが存在する場合、__init__ のコールを適切に型チェックできないため、これは重要です。 この場合、すべての引数をオプションとして扱うことがデフォルトになります。

型なしフィールドを防止

  • さらに、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