2011-10-13 73 views
6

我寫的接口由兩個應用程序使用。該接口應使用一些DoSomethingRequestDoSomethingResponse類來進行通信。Python的模型對象驗證

有沒有做一些模型驗證,例如像Django的Model任何庫?對象A必須具有類型爲str()的「text」屬性,類型爲int()的「number」屬性,類型爲「items」的屬性名單()。以乾的方式。

我正在尋找類似於以下,或更好:

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

Pr I我想這就是你要找的 – llazzaro

2

我覺得裝飾可以用於此。 檢查此鏈接

Combining Descriptors with Class Decorators for Validation

一種不同的方法check Duck typing

+1

我已經這樣做了,但我不喜歡在設置驗證器時必須重複屬性名稱的方式。 – Prody

+0

鴨子打字怎麼樣?我認爲以面向對象的方式是一種更好的方法。你依靠其他對象來使用你的對象的正確方式。這是一種不同的方法,比你不確定你是否喜歡它。 – llazzaro

+0

我喜歡鴨打字,但我需要找到一種方法,使用這種接口,「項目」有望成爲類型的實例列表告訴人們'MyEmbeddedModelClass' – Prody

0

因爲python是動態的,所以約定是要求對象像特定類的實例那樣行爲而不是強制執行特定類型。

某處在你的代碼,最好在您需要訪問這些屬性,但早在對象具有這些屬性,並進一步斷言,這些屬性是你希望他們成爲怎樣的可能斷言點。

這就提出了一個AssertionError異常,如果對象o,無論哪種類型,如果缺少 'someattribute' 屬性:

assert(hasattr(o, 'someattribute')) 

此外,如果o.someattribute不是字符串:

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

這正是我想要做的,但我想在自動驗證(自我)方法中做到這一點。在這種情況下使用TextField/IntField/etc類。 – Prody

+0

請注意,通過調用帶有「-O」標誌的Python,可以禁用斷言,所以不應該依賴流控制!只需將它們用作測試代碼的「額外檢查」即可。 – redShadow