ホームページ > バックエンド開発 > Python チュートリアル > Pydantic • データの検証とサニタイズに対処する

Pydantic • データの検証とサニタイズに対処する

PHPz
リリース: 2024-08-16 18:03:08
オリジナル
339 人が閲覧しました

Pydantic • Dealing with validating and sanitizing data

プログラミングを始めて以来、タスクにはより実践的で直接的な解決策が必要だったので、私は主に構造化パラダイムと手続き型パラダイムを使用してきました。データ抽出を扱うときは、より組織化されたコードを実現するために新しいパラダイムに移行する必要がありました。

この必要性の例としては、スクレイピング タスク中に、最初は処理方法を知っていたタイプの特定のデータをキャプチャする必要があったときがありましたが、その後突然、そのデータが存在しなかったり、キャプチャ中に別のタイプで表示されたりしました。 .

その結果、データが int か string かをチェックするために、いくつかの if ブロックと try and catch ブロックを追加する必要がありました...後で何もキャプチャされていないことがわかりました。なし辞書を使用すると、次のような状況で、興味のない「デフォルト データ」を保存することになります。

data.get(values, 0)
ログイン後にコピー

確かに、紛らわしいエラー メッセージは表示されないようにする必要がありました。

これが Python が動的である仕組みです。変数の型は、操作している型をより明確にする必要があるまで、いつでも変更できます。その後、突然大量の情報が表示され、現在、型ヒントと興味深い pydantic ライブラリをサポートする IDE を使用して、データ検証にどのように対処できるかを読んでいます。

データ操作などのタスクでは、新しいパラダイムを使用して、型を明示的に宣言したオブジェクトと、これらの型を検証できるライブラリを使用できるようになりました。何か問題が発生した場合、より詳しく説明されたエラー情報を確認することで、デバッグが容易になります。


ピダンティック

それでは、これが Pydantic のドキュメントです。さらにご質問がございましたら、いつでもご相談ください。

基本的には、すでにご存知のとおり、次のことから始めます。

pip install pydantic
ログイン後にコピー

そして、仮に、これらの電子メールを含むソースから電子メールをキャプチャしたいとします。そのほとんどは、「xxxx@xxxx.com」のようになります。ただし、場合によっては、「xxxx@」または「xxxx」のように表示される場合があります。キャプチャすべき電子メールの形式については何の疑問もありません。そのため、この電子メール文字列を Pydantic で検証します:

from pydantic import BaseModel, EmailStr

class Consumer(BaseModel):
    email: EmailStr
    account_id: int

consumer = Consumer(email="teste@teste", account_id=12345)

print(consumer)
ログイン後にコピー

pip install pydantic[email] でインストールされたオプションの依存関係「email-validator」を使用していることに注意してください。コードを実行すると、ご存知のとおり、無効な電子メール形式「teste@teste」:
でエラーが表示されます。

Traceback (most recent call last):
  ...
    consumer = Consumer(email="teste@teste", account_id=12345)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ...: 1 validation error for Consumer
email
  value is not a valid email address: The part after the @-sign is not valid. It should have a period. [type=value_error, input_value='teste@teste', input_type=str]
ログイン後にコピー

独自の検証を作成するのと同じように、オプションの依存関係を使用してデータを検証することは興味深いものであり、Pydantic では field_validator を介してこれを許可します。したがって、account_id はゼロより大きい正の値でなければならないことがわかります。異なる場合は、Pydantic が例外、つまり値のエラーがあったことを警告するのが興味深いでしょう。コードは次のようになります:

from pydantic import BaseModel, EmailStr, field_validator

class Consumer(BaseModel):
    email: EmailStr
    account_id: int

    @field_validator("account_id")
    def validate_account_id(cls, value):
        """Custom Field Validation"""
        if value <= 0:
            raise ValueError(f"account_id must be positive: {value}")
        return value

consumer = Consumer(email="teste@teste.com", account_id=0)

print(consumer)
ログイン後にコピー
$ python capture_emails.py
Traceback (most recent call last):
...
    consumer = Consumer(email="teste@teste.com", account_id=0)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

...: 1 validation error for Consumer
account_id
  Value error, account_id must be positive: 0 [type=value_error, input_value=0, input_type=int]
    For further information visit https://errors.pydantic.dev/2.8/v/value_error
ログイン後にコピー

次に、正しい値を使用してコードを実行します。

from pydantic import BaseModel, EmailStr, field_validator

class Consumer(BaseModel):
    email: EmailStr
    account_id: int

    @field_validator("account_id")
    def validate_account_id(cls, value):
        """Custom Field Validation"""
        if value <= 0:
            raise ValueError(f"account_id must be positive: {value}")
        return value

consumer = Consumer(email="teste@teste.com", account_id=12345)

print(consumer)
ログイン後にコピー
$ python capture_emails.py
email='teste@teste.com' account_id=12345
ログイン後にコピー

そうだね?!

ネイティブの「dataclasses」モジュールについても読みました。これはもう少し単純で、Pydantic といくつかの類似点があります。ただし、検証が必要なより複雑なデータ モデルを処理するには、Pydantic の方が適しています。データクラスは Python にネイティブに含まれていますが、Pydantic は、少なくとも、まだ含まれていません。

以上がPydantic • データの検証とサニタイズに対処するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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