Visual Studio Code
Pydantic は、標準の Python 型アノテーションの上に作成されているため、そのまま使用できるエディターや IDE でうまく動作します。
Visual Studio Code (VS Code) を使用する場合、 PyCharm プラグインで提供されるものと同等の追加のエディター機能がサポートされます。
これは、新しい Pydantic モデル インスタンスを作成しているときでも、型と必要な引数についてオートコンプリート(または「IntelliSense」) とエラー チェックが行われることを意味します。
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
です)。
新しい Pydantic モデル インスタンスを作成するときにオートコンプリートが行われるだけでなく、必要な引数のエラー チェックも行われるようになりました。
また、無効なデータ型のエラー チェックも行われます。
!!! 「技術的な詳細」 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
- ボックスにチェックを入れます(デフォルトではチェックが入っていません)
ヒントとコツ¶
ここでは、Pydantic で VS Code を使用する際の開発者エクスペリエンスを向上させるための追加のヒントとテクニックをいくつか紹介します。
厳密なエラー¶
この追加のエディター サポートが機能する仕組みは、Pylance が Pydantic モデルを Python の純粋なdataclasses
であるかのように扱うことです。
また、新しい Pydantic モデル インスタンスを作成するときに、引数で渡されたデータ型に関する厳密な型エラー チェックが表示されます。
この例では、 '23'
のstr
が引数age
に対して有効なint
ではないことを示していることがわかります。
age age='23'
age=23
が想定されます。
それにもかかわらず、Pydantic の設計、および主な特徴の 1 つは、データ型に対して非常に寛容であることです。
実際には、値'23'
のstr
受け入れ、それを値23
のint
に変換します。
これらの厳密なエラー チェックはほとんどの場合に非常に役立ち、多くのバグを早期に検出するのに役立ちます。ただし、 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
インスタンスに変換されます。
それにもかかわらず、型エラーとして検出されます。
このような場合、コードの残りの部分では厳密なエラーを保持しながら、非常に特定の場所で厳密なエラーを無効にするか無視する方法がいくつかあります。
以下に、それを実現するためのいくつかのテクニックを示します。
行内の型チェックを無効にする¶
次のコメントを使用して、特定の行のエラーを無効にすることができます。
# 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
型であると想定します。つまり、型を知らないかのように動作します。値の。
したがって、これは追加の変数を除いた前の例と同等です。
長所: エラーは特定の値についてのみ無視され、他の引数については追加のエラーが表示されます。追加の変数は必要ありません。
短所: Any
とcast
インポートする必要があるため、 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 はそれを使用してコードをチェックインし、「フリーズ」されたモデルに値を設定しようとしたときにエラーを検出できます。
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 に似た他のライブラリの作成者も、(「代替フォーム」を使用して) この標準をすぐに簡単に採用し、これらの追加のエディター機能の利点を得ることができます。
本文总阅读量次