python Schema優雅なデータ検証方式

3404 ワード

###Schemaとは何ですか.私たちがどんなアプリケーションをしても、ユーザーの入力と付き合う限り、ユーザーの入力データを信じないという原則があります.ユーザー入力に対して厳格な検証を行うことを意味し、web開発時には一般的に入力データはJSON形式でバックエンドAPIに送信され、APIは入力データに対して検証を行う.一般的に私は多くの判断を加えて、各種if、コードが醜いことを招いて、1種の方式が比較的に優雅にユーザーのデータを検証することができますか?Schemaが役に立ちました.
Schemaは非常に簡単で、数百行のコードで、最も核心的なクラスは1つです:Schema.
###1. Schemaクラスへの入力タイプ(int、str、floatなど)は、次のようになります.
from schema import Schema

Schema(int).validate(10)
10
Schema(int).validate('10')
SchemaUnexpectedTypeError: '10' should be instance of 'int'

Schemaは、validateメソッドが入力したオブジェクトが指定したタイプであるかどうかを検証し、入力したデータを返します.そうしないと、SchemaErrorの例外が放出されます(SchemaUnexpectedTypeErrorはSchemaErrorのサブクラスです).
###2. Schemaクラスに呼び出し可能なオブジェクト(関数、__call__付きクラスなど)を入力するには、次のようにします.
Schema(lambda x: 0(57) should evaluate to True

Schemaはvalidateメソッドから入力された値を対応する関数にパラメータとして入力し、関数の戻り値がTrueの場合は入力データを返します.そうしないと異常が放出されます.
###3. Schemaクラスへのvalidateメソッドを持つオブジェクトSchemaへの入力には、いくつかのクラス(Use、And、Orなど)も組み込まれています.これらのクラスのインスタンスにはvalidateメソッドがあり、Schemaのパラメータとして入力することもできます.たとえば、次のようになります.
from schema import Schema, And

# And            
Schema(And(str, lambda s: len(s) > 2)).validate('abcd')
'abcd'

###4. Schemaクラスにコンテナオブジェクト(list、tuple、setなど)を入力するには、次のようにします.
Schema([int, float]).validate([1, 2, 3, 4.0])
[1, 2, 3, 4.0]

すなわち、[1,2,3,4.0]のいずれかの要素については、intまたはfloatでなければならない(orの関係に注意)
###5. Schemaに辞書オブジェクトを入力します(ほとんどのSchemaを使用するシーンは辞書オブジェクトを入力します.これは重要です).
Schema({'name': str, 'age': int}).validate({'name': 'foobar', 'age': 18})
{'age': 18, 'name': 'foobar'}
Schema({'name': str, 'age': int}).validate({'name': 'foobar'})
SchemaMissingKeyError: Missing keys: 'age'

まず,2つの概念を明確にし,Schemaクラスからの辞書をパターン辞書,valdiateメソッドからの辞書をデータ辞書と呼ぶ.
まず、Schemaは、パターン辞書とデータ辞書のkeyが全く同じかどうか、違うと直接異常を投げ出すかどうかを判断します.もし同じならば、データ辞書のvalueを持ってモード辞書の相応のvalueを検証して、もしデータ辞書のすべてのvalueが検証して通過することができるならばやっとデータを返して、さもなくば異常を投げ出して、このような検証が急にさわやかになったと感じますか?
###6. faqs Schemaが辞書に入ってくるのは使いやすいですが、私のデータはオプションです.つまり、keyが提供しなくてもいいものがあります.どうすればいいですか.
from schema import Optional, Schema


Schema({'name': str, Optional('age'): int}).validate({'name': 'foobar'})
{'name': 'foobar'}
Schema({'name': str, Optional('age', default=18): int}).validate({'name': 'foobar'})
{'age': 18, 'name': 'foobar'}

私はSchemaに辞書の中の一部のデータだけを検証させたいのですが、余分なkeyを持ってもいいですが、間違えないでください.どうすればいいですか.
Schema({'name': str, 'age': int}, ignore_extra_keys=True).validate({'name': 'foobar', 'age': 100, 'sex': 'male'})
{'age': 100, 'name': 'foobar'}

Schemaが投げ出した異常情報は友好的ではありません.エラー情報をカスタマイズしたいのですが、どうすればいいですか?Schemaが持つクラス(Use、And、Or、Regex、Schemaなど)には、エラー情報をカスタマイズできるパラメータerrorがあります.
Schema({'name': str, 'age': Use(int, error='       ')}).validate({'name': 'foobar', 'age': 'abc'})
SchemaError:        

参照先:https://segmentfault.com/a/1190000011777230 https://github.com/keleshev/schema