2011-10-13 11 views
6

私は2つのアプリケーションで使用するインタフェースを作成しています。このインターフェイスは、通信を行うには、いくつかのDoSomethingRequestクラスとDoSomethingResponseクラスを使用する必要があります。Pythonモデルオブジェクトの検証

DjangoのModelのように、モデル検証を行うライブラリはありますか?

私は基本的に次のようなことを言いたいと思います:
オブジェクトAは、タイプがstr()の "text"プロパティ、タイプint( ")の" number "プロパティ、タイプリスト()。 DRYの方法で。

私は次のようなものを探している、またはより良いよ

class MyEmbeddedModelClass(EmbeddedModel): 
    text = TextField(required = True) 

class MyModel(Model): 
    text = TextField(required = True) 
    number = IntField(default = 0) 
    items = ListField(EmbeddedModel) 


a = MyModel() 
a.text = "aaaa" 
a.number = 1 
a.items = [ 
    MyEmbeddedModelClass("bbbb"), 
    MyEmbeddedModelClass("cccc"), 
    MyEmbeddedModelClass("dddd") 
] 
a.validate() 

私は私自身を書くことができます知っているが、利用可能な場合、私はむしろ、ライブラリを使用すると思い、私はに少し新たなんですこの。

+0

あなたがそれを好きなら、DjangoのORMを使ってみませんか? –

+1

@ChrisMorgan:DjangoのORMはリレーショナル固有のものなので、EmbeddedModelはありません。 DjangoのORMには、私が必要としない余分なものがたくさんあります。 – Prody

答えて

3

、インターフェイスを強制する、または、契約による設計を使用したい場合、あなたはおそらくzope.interfaceライブラリをしたいです。 Zopeの起源を反映した名前にもかかわらず、実際にはそのフレームワークに結び付けられておらず、外部ではかなり使用可能です。

+1

Prody私はこれがあなたが探していると思います – llazzaro

2

私はこのためにデコレータを使用できると思います。 チェックこのリンク

Combining Descriptors with Class Decorators for Validation

異なるアプローチについては

check Duck typing

+1

私はすでにそれを行っていますが、バリデータを設定するときにプロパティ名を繰り返す必要はありません。 – Prody

+0

ダックタイピングはどうですか?私はオブジェクト指向の方が良いアプローチだと思います。あなたは、あなたのオブジェクトに適切な方法で他のオブジェクトを使用しています。これはあなたがそれを好きであるかどうか分からないあなたとは異なるアプローチです。 – llazzaro

+0

私はアヒルのタイピングが好きですが、このインターフェースを使用している人に、「アイテム」が「MyEmbeddedModelClass」タイプのインスタンスのリストであると予想されることを伝える方法を見つける必要があります。 – Prody

0

Pythonは動的なので、オブジェクトにはを要求するのがコンセプトで、特定のタイプを強制するのではなく、特定のクラスのインスタンスに似ています。

コード内のどこかで、これらのプロパティにアクセスする必要がある時点で、可能な限り早くオブジェクトにこれらのプロパティがあることをアサートし、それらのプロパティが期待どおりであることをさらに主張します。

オブジェクトo場合、それは 'someattribute' 属性が欠落している場合、これは、種類に関係なく、AssertionError例外が発生します:

さらに
assert(hasattr(o, 'someattribute')) 

o.someattributeが文字列でない場合:

assert(isinstance(o.someattribute, basestring)) 
+0

これはまさに私がやろうとしていることですが、自動的に 'validate(self)'メソッドでそれをやりたいのです。この場合、TextField/IntField/etcクラスを使用します。 – Prody

+0

'' -O''フラグを付けてPythonを呼び出すことで、アサーションを無効にすることができるので、フロー制御に頼らないように注意してください!あなたのコードをテストするための "余分なチェック"としてそれらを使用してください。 – redShadow

関連する問題