ホームページ > バックエンド開発 > Python チュートリアル > Pydantic: 手動検証の終わり! ✨

Pydantic: 手動検証の終わり! ✨

Patricia Arquette
リリース: 2024-11-26 00:07:11
オリジナル
933 人が閲覧しました

Pydantic は、Python 用のデータ検証および設定管理ライブラリです。 Python の型ヒントを使用してデータを検証および解析し、コードが適切に構造化され型指定されたデータを処理できるようにします。 Pydantic では、Python のデータクラスに似たモデル構造を活用することで、複雑なデータのスキーマを簡単に定義し、きれいな Python 的な方法でデータを自動的に検証し、シリアル化/逆シリアル化することができます。主な機能を見てみましょう:

データの検証

Python の型ヒントを使用して、スキーマに対して入力データを自動的に検証します。

from pydantic import BaseModel, ValidationError

class User(BaseModel):
    id: int
    name: str
    email: str

# Valid input
user = User(id=1, name="John Doe", email="john@example.com")
print(user)

# Invalid input
try:
    user = User(id="not-an-integer", name="Jane", email="jane@example.com")
except ValidationError as err:
    print(err)
ログイン後にコピー

データ モデルを定義したい場合は、pydantic.BaseModel を使用してください!

機能の検証

Pydantic は、データ モデルだけでなく、関数の入出力も検証するための強力なツールを提供します。これは @validate_call デコレーターを使用して実現され、関数の引数と戻り値に対して厳密なデータ検証を強制できるようになります。指定された引数または戻り値の型が予期される型と一致しない場合、ValidationError が発生します。

from pydantic import validate_call

@validate_call
def greet(name: str, age: int) -> str:
    return f"Hello {name}, you are {age} years old."

# Valid input
print(greet("Alice", 30))  # Output: Hello Alice, you are 30 years old.

# Invalid input
try:
    greet("Bob", "not-a-number")
except Exception as e:
    print(e)
ログイン後にコピー

@validate_call で validate_return フラグを有効にすることにより、Pydantic は注釈付きの戻り値の型に対して関数の戻り値も検証します。これにより、関数が期待される出力スキーマに準拠することが保証されます。

from pydantic import validate_call

@validate_call(validate_return=True)
def calculate_square(number: int) -> int:
    return number ** 2  # Correct return type

# Valid input and return
print(calculate_square(4))  # Output: 16

# Invalid return value
@validate_call(validate_return=True)
def broken_square(number: int) -> int:
    return str(number ** 2)  # Incorrect return type

try:
    broken_square(4)
except Exception as e:
    print(e)
ログイン後にコピー

解析中

Pydantic は、JSON データを含む複雑な入れ子構造をモデル オブジェクトに解析できます。

from pydantic import BaseModel
from typing import List

class Item(BaseModel):
    name: str
    price: float

class Order(BaseModel):
    items: List[Item]
    total: float

# JSON-like data
data = {
    "items": [
        {"name": "Apple", "price": 1.2},
        {"name": "Banana", "price": 0.8}
    ],
    "total": 2.0
}

order = Order(**data) 
print(order) # items=[Item(name='Apple', price=1.2), Item(name='Banana', price=0.8)] total=2.0
ログイン後にコピー

シリアル化と逆シリアル化

Pydantic モデルは JSON または辞書にシリアル化し、再構築できます。

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    email: str

# Create a model instance
user = User(id=1, name="Alice", email="alice@example.com")

# Serialize to dictionary and JSON
user_dict = user.model_dump()
user_json = user.model_dump(mode='json')

print("Dictionary:", user_dict)
print("JSON:", user_json)

# Deserialize back to the model
new_user = User.model_validate(user_json)
print("Parsed User:", new_user)
ログイン後にコピー

柔軟な検証

データ検証は強制型検証ではありません。たとえば、それぞれ int、bool、datetime 型の id、due_date、priority フィールドを使用してモデルを定義する場合、次のように渡すことができます。

  • IDとして数値文字列
  • ISO-8601UTC、または due_date としての他の日付形式の文字列
  • 優先度として「はい」/「いいえ」、「オン」/「オフ」、「true」/「false」、1/0 など
from sensei import APIModel
from datetime import datetime


class Task(APIModel):
    id: int
    due_date: datetime
    priority: bool


task = Task(due_date='2024-10-15T15:30:00',>



<p>The result will be<br>
</p>

<pre class="brush:php;toolbar:false">Task(id=1, due_date=datetime.datetime(2024, 10, 15, 15, 30), priority=True)
ログイン後にコピー

カスタム検証

バリデーターを使用してモデル内にカスタム検証ロジックを定義することもできます。これらを使用すると、組み込み型やフィールド制約を使用して簡単に表現できない、より複雑な検証ルールを適用できます。バリデータは、field_validator デコレータまたは Field オブジェクトを通じて定義されます。 1 つ以上のフィールド名を field_validator に渡して、どのフィールドがこのバリデータを使用するかを決定するか、「*」を渡してすべてのフィールドにバリデータを適用できます。

import Any と入力してから
pydantic import フィールド、field_validator、EmailStr、BaseModel から

クラス ユーザー(ベースモデル):
    ID: 整数
    ユーザー名: str = フィールド(パターン=r'^w $')
    電子メール: EmailStr
    年齢: int = フィールド(18, ge=14)
    is_active: bool = True
    役割: リスト[str]

    # 内部解析の「前」に実行されるバリデータを定義します
    @field_validator('役割', モード='前')
    def _validate_roles(cls、値: 任意):
        戻り値.split(',') if isinstance(value, str) else value

ユーザー = ユーザー(id=1、ユーザー名='john'、電子メール='john@example.com'、役割='学生、歌手')
プリント(ユーザー) #>



<h2>
  
  
  オープンソース プロジェクト
</h2>

<p>Pydantic を利用したオープンソース プロジェクトが多数あります。それらの最高のものを探ってみましょう:</p>

<h3>
  
  
  ファストAPI
</h3>

<p>Pydantic の最も顕著な使用例の 1 つは、Python で API を構築するための最新の Web フレームワークである FastAPI です。 FastAPI は、リクエスト本文の検証、クエリ パラメータ、レスポンス スキーマに Pydantic モデルを広範囲に使用します。</p>

ログイン後にコピー
  • 出典: https://github.com/fastapi/fastapi
  • ドキュメント: https://fastapi.tiangolo.com

Pydantic: The end of manual validations! ✨

先生

FastAPI は API を構築するように設計されていますが、Sensei はこれらの API を迅速かつ簡単にラップするように設計されています。 Teacher を活用した API クライアントにより、ユーザーは関連性の高いデータ モデルを確実に取得でき、混乱を招くエラーが発生しません。

  • 出典: https://github.com/CrocoFactory/先生
  • ドキュメント: https://Sensei.crocofactory.dev

Pydantic: The end of manual validations! ✨

SQLModel とタイパー

SQLModelTyper は、FastAPI の作成者である Sebastián Ramírez によって開発された 2 つの注目すべきプロジェクトです。

SQLModel は、Python アプリケーションでのデータベース対話を合理化するために設計されたライブラリです。 SQLAlchemyPydantic の上に構築された SQLModel は、ORM の能力とデータ検証とシリアル化の利便性を組み合わせています。

  • 出典: https://github.com/fastapi/sqlmodel
  • ドキュメント: https://sqlmodel.tiangolo.com

Typer は、Python を使用してコマンドライン インターフェイス (CLI) アプリケーションを作成するためのフレームワークです。 Python のタイプヒントを使用して、ユーザーフレンドリーな CLI コマンドとヘルプ テキストを自動的に生成することで、プロセスを簡素化します。

  • 出典: https://github.com/fastapi/typer
  • ドキュメント: https://typer.tiangolo.com

以上がPydantic: 手動検証の終わり! ✨の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート