コンテンツにスキップ

Visual Studio Code

Pydantic は、標準の Python 型アノテーションの上に作成されているため、そのまま使用できるエディターや IDE でうまく動作します。

Visual Studio Code (VS Code) を使用する場合、 PyCharm プラグインで提供されるものと同等の追加のエディター機能がサポートされます。

これは、新しい Pydantic モデル インスタンスを作成しているときでも、型と必要な引数についてオートコンプリート(または「IntelliSense」) とエラー チェックが行われることを意味します。

pydantic autocompletion in VS Code

VS コードの構成

これらの機能を活用するには、推奨設定を使用して VS Code を正しく構成する必要があります。

別の構成を使用している場合に備えて、手順の簡単な概要を次に示します。

パイランスをインストールする

VS Code のPylance拡張機能を使用する必要があります。これは、Python 用の推奨される次世代の公式 VS Code プラグインです。

Pylance はデフォルトでPython Extension for VS Codeの一部としてインストールされるため、おそらく問題なく動作するはずです。それ以外の場合は、エディターにインストールされ有効になっていることを再確認してください。

環境を構成する

次に、エディターが Python プロジェクトのPython 環境(おそらく仮想環境) を認識していることを確認する必要があります。

これは、Pydantic をインストールした環境になります。

Pylanceの構成

デフォルト設定ではオートコンプリートがサポートされますが、Pylance は型エラーをチェックしない可能性があります。

次の手順で、Pylance からの型エラー チェックを有効にできます。

  • 「ユーザー設定」を開きます
  • Type Checking Modeの検索
  • 以下にオプションがあります Python › Analysis: Type Checking Mode
  • basicまたはstrictに設定します (デフォルトではoffです)。

Type Checking Mode set to strict in VS Code

新しい Pydantic モデル インスタンスを作成するときにオートコンプリートが行われるだけでなく、必要な引数のエラー チェックも行われるようになりました。

Required arguments error checks in VS Code

また、無効なデータ型のエラー チェックも行われます。

Invalid data types error checks in VS Code

!!! 「技術的な詳細」 Pylance は VS Code 拡張機能であり、クローズド ソースですが、無料で使用できます。その下で、Pylance はすべての面倒な作業を行うPyrightと呼ばれるオープンソース ツール (これも Microsoft 製) を使用しています。

You can read more about it in the [Pylance Frequently Asked Questions](https://github.com/microsoft/pylance-release/blob/main/FAQ.md#what-is-the-relationship-between-pylance-pyright-and-the-python-extension).

mypy を構成する

また、(Pylance の代わりに/追加で) エディターでインラインで mypy エラー チェックを取得するように、VS Code で mypy を構成することもできます。

これには、 Pydantic mypy プラグイン (構成している場合) によって検出されたエラーが含まれます。

VS Code で mypy を有効にするには、次の手順を実行します。

  • 「ユーザー設定」を開きます
  • Mypy Enabled
  • 以下にオプションがあります Python › Linting: Mypy Enabled
  • ボックスにチェックを入れます(デフォルトではチェックが入っていません)

mypy enabled in VS Code

ヒントとコツ

ここでは、Pydantic で VS Code を使用する際の開発者エクスペリエンスを向上させるための追加のヒントとテクニックをいくつか紹介します。

厳密なエラー

この追加のエディター サポートが機能する仕組みは、Pylance が Pydantic モデルを Python の純粋なdataclassesであるかのように扱うことです。

また、新しい Pydantic モデル インスタンスを作成するときに、引数で渡されたデータ型に関する厳密な型エラー チェックが表示されます。

この例では、 '23'strが引数ageに対して有効なintではないことを示していることがわかります。

VS Code strict type errors

age age='23' age=23が想定されます。

それにもかかわらず、Pydantic の設計、および主な特徴の 1 つは、データ型に対して非常に寛容であることです。

実際には、値'23'str受け入れ、それを値23intに変換します。

これらの厳密なエラー チェックはほとんどの場合に非常に役立ち多くのバグを早期に検出するのに役立ちます。ただし、 age='23'の場合のように、「偽陽性」エラーが報告されて不都合になる場合もあります。


age='23'を使用した上記の例は、エラーとタイプの違いを示すために意図的に単純化されています。

しかし、これらの厳密なエラーが不便になる一般的なケースは、 datetimeフィールドのint値や Pydantic サブモデルのdict値など、より高度なデータ型を使用する場合です。

たとえば、これは Pydantic に有効です。

from pydantic import BaseModel


class Knight(BaseModel):
    title: str
    age: int
    color: str = 'blue'


class Quest(BaseModel):
    title: str
    knight: Knight


quest = Quest(
    title='To seek the Holy Grail', knight={'title': 'Sir Lancelot', 'age': 23}
)

フィールドknightのタイプはクラスKnight (Pydantic モデル) で宣言され、コードは代わりにリテラルのdict渡します。これは Pydantic に対しても有効であり、 dict自動的にKnightインスタンスに変換されます。

それにもかかわらず、型エラーとして検出されます。

VS Code strict type errors with model

このような場合、コードの残りの部分では厳密なエラーを保持しながら、非常に特定の場所で厳密なエラーを無効にするか無視する方法がいくつかあります。

以下に、それを実現するためのいくつかのテクニックを示します。

行内の型チェックを無効にする

次のコメントを使用して、特定の行のエラーを無効にすることができます。

# type: ignore

または (pylance/pyright に固有):

# pyright: ignore

( pyright はPylance によって使用される言語サーバーです。)

age='23'の例に戻ると、次のようになります。

from pydantic import BaseModel


class Knight(BaseModel):
    title: str
    age: int
    color: str = 'blue'


lancelot = Knight(title='Sir Lancelot', age='23')  # pyright: ignore

そうすれば、Pylance と mypy はその行のエラーを無視します。

長所: その行を簡単に変更するだけで、エラーが削除されます。

短所: 型チェック、引数のスペルミス、必要な引数が指定されていないなど、その行内の他のエラーも省略されます。

変数の型をオーバーライドする

使用する値を含む変数を作成し、 Anyを使用してその型を明示的に宣言することもできます。

from typing import Any

from pydantic import BaseModel


class Knight(BaseModel):
    title: str
    age: int
    color: str = 'blue'


age_str: Any = '23'
lancelot = Knight(title='Sir Lancelot', age=age_str)

そうすることで、Pylance と mypy は、 intが期待されているときに変数 age_str の型がstrであることを認識するのではなく、あたかもその型を知らないかのように変数age_strを解釈します (その後、対応するエラーが表示されます)。

長所: エラーは特定の値についてのみ無視され、他の引数については追加のエラーが表示されます。

短所: エラーを無視する必要がある引数ごとに、 Anyと新しい変数を新しい行にインポートする必要があります。

castで値の型をオーバーライドする

前の例と同じアイデアを、 cast()を使用して同じ行に置くことができます。

この方法では、別の変数を必要とせずに、値の型宣言がインラインでオーバーライドされます。

from typing import Any, cast

from pydantic import BaseModel


class Knight(BaseModel):
    title: str
    age: int
    color: str = 'blue'


lancelot = Knight(title='Sir Lancelot', age=cast(Any, '23'))

cast(Any, '23')値に影響を与えず、まだ単に'23'ですが、Pylance と mypy はそれがAny型であると想定します。つまり、型を知らないかのように動作します。値の。

したがって、これは追加の変数を除いた前の例と同等です。

長所: エラーは特定の値についてのみ無視され、他の引数については追加のエラーが表示されます。追加の変数は必要ありません。

短所: Anycastインポートする必要があるため、 cast()使用に慣れていない場合、最初は奇妙に思えるかもしれません。

クラス引数での設定

Pydantic には、豊富な Model Configurations セットが用意されています。

これらの構成は、各モデルの内部class Configで設定できます。

from pydantic import BaseModel


class Knight(BaseModel):
    model_config = dict(frozen=True)
    title: str
    age: int
    color: str = 'blue'

または、モデル クラスを定義するときにキーワード引数として渡されます。

from pydantic import BaseModel


class Knight(BaseModel, frozen=True):
    title: str
    age: int
    color: str = 'blue'

(ベータ版で) frozen特定の構成には特別な意味があります。

これにより、作成されたモデル インスタンスが他のコードによって変更されるのを防ぎ、モデル インスタンスを「フリーズ」状態に保ちます。

2 番目のバージョンを使用して、 frozen=True (クラス定義のキーワード引数を使用) を宣言すると、Pylance はそれを使用してコードをチェックインし、「フリーズ」されたモデルに値を設定しようとしたときにエラーを検出できます。

VS Code strict type errors with model

Fieldを使用してデフォルトを追加する

Pylance/pyright では、フィールドがオプションであることを推測するために、 default Fieldのキーワード引数にする必要があります。

from pydantic import BaseModel, Field


class Knight(BaseModel):
    title: str = Field(default='Sir Lancelot')  # this is okay
    age: int = Field(
        23
    )  # this works fine at runtime but will case an error for pyright


lance = Knight()  # error: Argument missing for parameter "age"

これはデータクラス変換の制限であり、pydantic では修正できません。

技術的な詳細

!!!警告 Pydantic ユーザーは、以下の詳細は必要ありません。このセクションの残りの部分は読み飛ばしてください。

These details are only useful for other library authors, etc.

この追加のエディター サポートは、提案されているDataclass Transform (PEP 681)の標準草案を実装することによって機能します。

提案されている標準草案は、オープン ソース パッケージ Pyright (VS Code で Python サポートを提供するために Pylance によって使用されている) の作成者と同じ Microsoft チームの Eric Traut によって書かれています。

この標準の目的は、Pydantic などのライブラリがエディタやツールに、これらのライブラリ (例: Pydantic) をdataclassesであるかのように扱い、オートコンプリートや型チェックなどを提供するように指示する方法を提供することです。

標準草案には、新しい標準草案が完成して承認される前であっても、Pydantic のような早期採用者がすぐにサポートを追加できるようにするための代替フォームも含まれています。

この新しいドラフト標準は、代替フォームを備えており、Pyright によってすでにサポートされているため、VS Code の Pylance 経由で使用できます。

Python の公式標準として提案されているため、他のエディタでも簡単にサポートを追加できます。

また、Pydantic に似た他のライブラリの作成者も、(「代替フォーム」を使用して) この標準をすぐに簡単に採用し、これらの追加のエディター機能の利点を得ることができます。


本文总阅读量