Pythonでschemaを用いて与えられたデータがスキーマに適合するか確認する

スポンサーリンク

Pythonでschemaを用いて与えられたデータがスキーマに適合するか確認してみます。

今回はschemaを用います。このライブラリ・モジュールはPythonの標準ライブラリではありませんので、事前にインストールする必要があります。

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows11)

■schemaを用いて与えられたデータがスキーマに適合するか確認する

では、早速schemaを用いて与えられたデータがスキーマに適合するか確認を行うスクリプトを書いていきます。

■コード

import schema

# スキーマの定義
person_schema = schema.Schema({
    'name': str,
    'age': int,
    'email': schema.Or(None, str)
})

# データのバリデーション
def validate_person(person):
    try:
        person_schema.validate(person)
        print("データはスキーマに適合しています!")
    except schema.SchemaError as e:
        print("データはスキーマに適合していません。エラーメッセージ:")
        print(e)

# データの例
person1 = {
    'name': '田中 テスト太郎',
    'age': 25,
    'email': 'tanaka@example.com'
}

person2 = {
    'name': '久岡 団十郎',
    'age': '29',
    'email': 'h_dan@example.com'
}

person3 = {
    'name': '中村 テスト治郎',
    'age': 40
}

# データのバリデーションの呼び出し
validate_person(person1)
validate_person(person2)
validate_person(person3)

まずはschemaモジュールをインポートします。これにより、スキーマの定義やデータのバリデーションに必要なクラスや関数が使用できるようになります。

次に`schema.Schema`クラスを使用して、`person_schema`という変数にスキーマを定義します。スキーマは、ディクショナリ形式で指定します。ここでは、`name`が文字列、`age`が整数、`email`が文字列または`None`のいずれかであることを定義しています。

その後、def文を用いて`validate_person`という関数を定義します。この関数は、引数として`person`を受け取り、与えられたデータがスキーマに適合しているかどうかを確認します。さらに`try-except`構文を使用して、`person_schema.validate(person)`を実行します。`person_schema.validate(person)`は、与えられたデータがスキーマに適合しているかどうかを検証します。もしデータがスキーマに適合していない場合は、`schema.SchemaError`が発生し、それを`except`節でキャッチしてエラーメッセージを表示します。

その後、`person1`という変数に、スキーマに適合するデータを定義します。今回は`name`には日本語の文字列、`age`には整数、`email`にはメールアドレスの文字列を指定しています。同じようにして`person2`と`person3`を定義します。

定義後、`validate_person`関数を呼び出し、`person1`を引数として渡します。この呼び出しにより、与えられたデータがスキーマに適合しているかどうかが検証されます。同様に、`person2`と`person3`に対してもバリデーションが行われます。

なお、今回は日本語の文字列を含んだデータをバリデーションしていますが、`schema`モジュールは文字列のバリデーションに対して特別な処理は行いません。したがって、このコードは日本語の文字列にも適用可能です。

■検証・実行

今回書いたスクリプトを「s_d.py」という名前でPythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実行してみると、schemaを用いて与えられたデータがスキーマに適合するかどうかの確認が行われ、結果を表示させることができました。

コメント

タイトルとURLをコピーしました